2017-11-26 2 views
0

Ich habe die folgende Abfrage, wo ich SelectMany in einer Liste von Listen und dann GroupBy 'Name' und die 'Anzahl' der Listen und speichern Sie die Werte in ' Wert 'und' Anzahl '. auchCall SelectMany auf Liste der Artikel und Artikel aus der Liste als Parameter

var groups = originalList.SelectMany(fullList => fullList.ListOfItems, (fullList, details) => new { fullList.Name, fullList.ListOfItems }) 
            .GroupBy(x => x.Name, 
            x => x.ListOfItems.Count()) 
            .Select(g => new { Name = g.Key, Count = g.Count()}); 

//Do something with results   
foreach (var item in groups) 
{ 
    var name = item.Name; 
    var count = item.Count; 
} 

Jetzt mag ich die tatsächliche LISTOFITEMS durch zu meiner letzten Gruppe passieren, wie ich, dass zugreifen möchte.

Deshalb möchte ich am Ende mit:

foreach (var item in groups) 
{ 
    var value = item.Name; 
    var count = item.Count; 
    var list = item.ListOfItems. <-- I want this also 
} 

Wie kann ich diese Abfrage ändern, dies zu tun?

+2

Bitte geben Sie einige Beispieleingaben und erwartete Beispielausgaben. https://StackOverflow.com/Help/Mcve – mjwills

+0

Warum können Sie '.ToList()' am Ende dieser Zeile 'nicht hinzufügen. Wählen Sie (g => new {Name = g.Key, Count = g.Count()}). ToList(); ' – MethodMan

+0

Gegenwärtig zählt' Count' Punkte in jeder Gruppe und ignoriert das 'x. ListOfItems.Count() 'value. Hast du das vor? – dasblinkenlight

Antwort

1

können Sie umschreiben Ihre GroupByListOfItem zu halten, und fügen Sie seine Zählung im Select, wie folgt aus:

var groups = originalList 
    .SelectMany(
     fullList => fullList.ListOfItems 
    , (fullList, details) => new { fullList.Name, fullList.ListOfItems } 
    ) 
    .GroupBy(x => x.Name) 
    .Select(g => new { // Construct combined list of items 
     Name = g.Key 
    , ListOfItems = g.SelectMany(x => x.ListOfItems).ToList() 
    }) 
    .Select(x => new { // Add count 
     x.Name, x.ListOfItems, Count = x.ListOfItems.Count 
    }); 
+0

Danke dafür. Ich bin der Ansicht, dass die ListOfItems zurückgegeben die vollständige Liste der Elemente in der gesamten Originalliste ist. Wo ich nur die ListofItems benötige, die mit bestimmten Namen verknüpft sind. –

0

Ihre Anfrage viel zu viel tut. Es erstellt Objekte, die Name so oft wie die Anzahl der Elemente in jedem ListOfItems duplizieren, und dann müssen Sie GroupBy verwenden, um wieder Name zu duplizieren.

Die natürliche Gruppe ist schon da: originalList selbst. Sie müssen nur Elemente aus dieser Liste auswählen und ihre ListOfItems und ihre Anzahl zurückgeben:

from org in originalList 
select new 
{ 
    org.Name, 
    Count = org.ListOfItems.Count(), 
    Items = org.ListOfItems 
} 
Verwandte Themen