2015-12-08 18 views
6

Bir listenin içeriğini filtrelemek ve sıralamak için bir işlev oluşturdum.Birden çok Linq ifadesini birleştirin

Biraz 'ısırık' gibi görünüyor, ancak Linq güçlü bir nokta değil. Fonksiyonun, performans perspektifi veya hatta estetik perspektiften akıcı hale getirilip getirilemeyeceğini merak ediyorum. - 'doğrudan' ajanları ve düzeni onlara olsun

var direct = agents 
     .Where(x => x.IsDirect) 
     .OrderByDescending(x => x.MinPrice); 

aktif sıralar

var agents = XmlHelper 
     .Deserialise<AgentConfigs>("~/Pingtree.xml") 
     .Agents 
     .Where(x => x.IsActive == true); 

// Öncelikle bir sınıf oluşturmak için

// XML Deserialise: Burada

kod // Ikinci - dolaylı aracıları bulun ve sipariş edin

var agency = agents 
     .Where(x => !x.IsDirect) 
     .OrderBy(x => x.Priority); 
emir

Agents = direct.Concat(agency).ToList(); 

bu geliştirilebilir nasıl bir düşünce istinat birlikte 210

// Bolt 2 Alt listeler? Her iki bölme GroupBy veya ToLookup kullanabilirsiniz

+1

Muhtemelen http://codereview.stackexchange.com/ adresine gidin http://codereview.stackexchange.com/ – HimBromBeere

+0

Çözüm iyi çalışıyorsa ve nasıl daha iyi oluşturulabileceğine dair iyileştirme/gözden geçirme istiyorsanız, http://stackoverflow.com/review adresine gönderin. –

+0

İlk olarak, Resharper ile işaretlenmiş olan aynı sayıları birden çok kez yineleyin. Bu, performans sorunlarına neden olabilir ve daha fazla sorgulama yapmadan önce temsilcilerinizde '.Listen’i çağırarak kolayca önlenebilir. – HimBromBeere

cevap

5

i bu durumda ToLookup tercih:

var activeAgentDirectLookup = XmlHelper 
    .Deserialise<AgentConfigs>("~/Pingtree.xml") 
    .Agents 
    .Where(x => x.IsActive == true) 
    .ToLookup(a => a.IsDirect); 

Agents = activeAgentDirectLookup[true].OrderByDescending(x => x.MinPrice) 
    .Concat(activeAgentDirectLookup[false].OrderBy(x => x.Priority)) 
    .ToList(); 

A lookup bu durumda (bu yüzden iki olası gruplar) içinde anahtar olarak bir bool bir sözlüğe benzer. Değerler IEnumerable<Agents>, yani IsDirect veya !IsDirect olan tüm aracılardır. Buradaki fayda, sadece bir kez değerlendirmeniz gerektiğidir.

+0

Cevabınız Tim için teşekkürler. Ben kod tarafından şaşırmış bir littledim - lütfen bitlerin ne yaptığını açıklayabilir misiniz. –

+1

Bir arama, bir anahtar olarak "boole" olan bir sözlüke benzer (yani iki olası grup). Değerler "IEnumerable ", yani "IsDirect" veya "! IsDirect" olan tüm aracılardır. Buradaki fayda, sadece bir kez değerlendirmeniz gerektiğidir. –

+0

Ah, şimdi alın - güzel çözüm! –

İlgili konular