2015-12-08 13 views
6

Stworzyłem funkcję filtrowania i sortowania zawartości listy.Połączyć wiele instrukcji Linq Where

Wydaje się nieco "bitty", jednak Linq nie jest mocnym punktem. Zastanawiam się, czy funkcja może być usprawniona, czy to z perspektywy wydajności, czy nawet z perspektywy estetycznej.

Oto kod:

// Deserialise XML utworzyć klasę aktywnych wierszy

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

// Po pierwsze - uzyskać środki 'bezpośrednia' i zamówić je

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

// Po drugie - uzyskaj pośredników i zamów je

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

// rygla 2 na listach podrzędnych razem, zachowując kolejność

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

wszelkie myśli o tym, jak można to poprawić?

+1

Shopuld prawdopodobnie przejdź do http://codereview.stackexchange.com/ – HimBromBeere

+0

Jeśli rozwiązanie działa dobrze, a chcesz poprawić/przeglądu, w jaki sposób można go lepiej skonstruować, opublikuj na http://stackoverflow.com/review –

+0

Po pierwsze, powtarzaj te same wyliczenia wiele razy, które są oznaczone przez Resharper np. Może to spowodować problemy z wydajnością i można go łatwo uniknąć, wywołując '.ToList' na agentach przed wykonaniem dalszych zapytań. – HimBromBeere

Odpowiedz

5

Można użyć GroupBy lub ToLookup podzielić zarówno wolę ToLookup w tym przypadku:

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(); 

lookup jest podobny do słownika z bool jako klucz w tym przypadku (tak dwóch możliwych grup). Wartości są następujące: IEnumerable<Agents>, a więc wszystkie czynniki, które są albo IsDirect lub !IsDirect. Zaletą jest to, że musisz ją tylko raz ocenić.

+0

Dzięki za odpowiedź Tim. Jestem zakłopotany tym kodem - proszę, możesz opisać, co robią bity. –

+1

Wyszukiwanie jest podobne do słownika z 'bool' jako kluczem (czyli dwiema możliwymi grupami). Wartości to 'IEnumerable ', więc wszystkie agenty, które są albo 'IsDirect' lub'! IsDirect'. Zaletą jest to, że musisz ją tylko raz ocenić. –

+0

Ah, weź teraz - fajne rozwiązanie! –