2012-02-08 20 views
7

Napisałem metodę, która pobiera kolekcję przedmiotów (pozycje cenowe - każda pozycja ma ilość i kod) i grupuje je według kodu, a następnie zwraca IDictionary gdzie klucz jest kodem przedmiotu oraz wartości jest grupa przedmiotów z tym kodemGrupuj kolekcję i zwróć słownik

Tutaj jest wdrożenie metody (mam nadzieję, że ma sens!):

public IDictionary<string, IEnumerable<PriceDetail>> GetGroupedPriceDetails(IEnumerable<PriceDetail> priceDetails) 
{ 
    // create a dictionary to return 
    var groupedPriceDetails = new Dictionary<string, IEnumerable<PriceDetail>>(); 

    // group the price details by code 
    var grouping = priceDetails.GroupBy(priceDetail => priceDetail.Code); 

    // foreach grouping, add the code as key and collection as value to the dictionary 
    foreach (var group in grouping) 
    { 
     groupedPriceDetails.Add(group.Key, group); 
    } 

    // return the collection 
    return groupedPriceDetails; 
} 

potem próbował byłaby to użycie ToDictionary jak tak :

// group the price details by code and return 
return priceDetails.GroupBy(priceDetail => priceDetail.Code) 
        .ToDictionary(group => group.Key, group => group); 

Występuje błąd podczas próby kompilacji, która mówi, że nie mogę przekonwertować ze słownika string, IGrouping<string, PriceDetail> na słownik string, IEnumerable<PriceDetail>.

Czy ktoś może mi powiedzieć, jak poprawnie poprawić moją pierwszą próbę tej metody? Czuję, że istnieje bardziej zwięzły sposób pisania, ale nie mogę tego zrozumieć!

Odpowiedz

12

Jak o:

public ILookup<string, PriceDetail> GetGroupedPriceDetails(IEnumerable<PriceDetail> priceDetails) 
{ 
    return priceDetails.ToLookup(priceDetail => priceDetail.Code); 
} 
+0

chcę kolekcja wrócił do nadwozia za pomocą kodu, a wartość dla każdego klucza powinna być zbiorem PriceDetails dla ten kod - tak >. Czy mogę to zrobić za pomocą twojej metody? –

+1

Jeśli przekształcasz się w słownik tylko po to, aby wyszukać kod i uzyskać kolekcję, bez zamiaru dalszego modyfikowania słownika, ILookup lepiej pasuje. – Wilhelm

+0

Kolejnym etapem procesu po powrocie z tej metody jest iteracja w kolekcji (czyli w przypadku każdej grupy) i zsumowanie ilości kolekcji szczegółów dotyczących cen dla tej grupy. Czy coś mi umyka? Czy mogę to zrobić za pomocą programu ILookup? Albo, pisząc to, myślę, że powinienem zwrócić coś, co ma kod jako klucz, a następnie kwotę, która jest sumą i zrobić wszystko w jedną metodę ... wszelkie sugestie bardzo doceniane! –

11

Nie można zrobić:

priceDetails.GroupBy(priceDetail => priceDetail.Code) 
       .ToDictionary(group => group.Key, group => group.ToList()) 
+2

Czuję, że to jest odpowiedź –