アイテムのリストを作成しましょう。
List<Item> items = new List<Item>();
items.Add(new Item() { ItemId = 1, ItemName = "Test1", ListId = 1 });
items.Add(new Item() { ItemId = 2, ItemName = "Test2", ListId = 1 });
items.Add(new Item() { ItemId = 3, ItemName = "Test3", ListId = 1 });
items.Add(new Item() { ItemId = 4, ItemName = "List", ListId = 2 });
items.Add(new Item() { ItemId = 5, ItemName = "List2", ListId = 2 });
items.Add(new Item() { ItemId = 6, ItemName = "Testing", ListId = 3 });
items.Add(new Item() { ItemId = 7, ItemName = "Testing2", ListId = 3 });
items.Add(new Item() { ItemId = 8, ItemName = "Testing3", ListId = 3 });
var groupByResult = items.GroupBy(i => i.ListId);
このGroupBy
呼び出しの後は、基本的にインターフェイスを実装するオブジェクトのコレクションであるgroupByResult
型の変数です。これにより、から派生し、 という名前の追加フィールドを持つすべてのアイテムを反復処理できます。IEnumerable<IGrouping<int, Item>>
IGrouping
IGrouping
IEnumerable<>
Key
public interface IGrouping<out TKey, out TElement> : IEnumerable<TElement>, IEnumerable
{
TKey Key { get; }
}
簡単に言えば、GroupBy
メソッド呼び出しはリストのリストを返します。質問で述べたように、外側のリストは「バケット」に対応します。次に、各「バケット」には、その「バケット」に対応するアイテムが含まれます。あなたの例に固有の値は、このgroupByResult
スクリーンショットに示されています。ご覧のとおり、最初のコレクションは、それぞれ 3 つ、2 つ、3 つの項目を持つ 3 つの異なるバケットにグループ化されました。
これらのグループの項目へのアクセスに関しては、単純な LINQ を使用できます。
List<Item> firstBucketItems = groupByResult.First(i => i.Key == 1).ToList();
List<Item> secondBucketItems = groupByResult.First(i => i.Key == 2).ToList();
List<Item> thirdBucketItems = groupByResult.First(i => i.Key == 3).ToList();

または、すべてのアイテムを反復処理することもできます:
foreach (var itemGroup in groupByResult)
{
int groupKey = itemGroup.Key;
foreach (Item item in itemGroup)
{
// Do whatever...
}
}