2017-11-26 12 views
0

リストのリストでSelectManyを使用し、GroupByの「名前」とリストの「数」を使用して値を ' 「値」と「カウント」。SelectManyを呼び出して項目リストを返し、パラメータとしてリストから項目を返します

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; 
} 

実際のListOfItemsを最後のグループに渡したいので、これもアクセスしたいと思います。私はこれを行うには、このクエリを変更するにはどうすればよい

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

は、だから私はで終わるしたいですか?

+2

サンプル入力と予想サンプル出力を提供してください。 https://stackoverflow.com/help/mcve – mjwills

+0

なぜこの行の最後に '.ToList()'を追加できないのですか?.Select(g => new {Name = g.Key、Count = g.Count ()})。ToList(); ' – MethodMan

+0

現在、' Count'は 'xを無視して各グループの項目を数えます。 ListOfItems.Count() '値。これはあなたが持っている予定ですか? – dasblinkenlight

答えて

1

あなたのGroupByListOfItemを維持するために書き換え、このように、Selectにそのカウントを追加することができます。

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

ありがとうございます。返されるListOfItemsが、originalList全体のItemの完全なリストであることがわかりました。私は特定の名前に関連付けられているListofItemsだけが必要です。 –

0

あなたのクエリがあまりにも多くありません。 Nameを各項目の数と同じ回数だけ重複して複製し、Nameを再度複製するにはGroupByを使用する必要があります。

自然のグループはすでにそこにあります:originalListそれ自身。そのリストから項目を選択し、その数を返すだけでListOfItemsとその数を返してください:

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