16

私はそのようなアイテムのリストを持っています:

public class Item
{
    public int ItemId { get; set; }
    public string ItemName { get; set; }
    public int ListId { get; set; }
}

1 Test1 1

2 Test2 1

3 Test3 1

4 List 2

5 List2 2

6 Testing 3

7 Testing2 3

8 Testing3 3

でグループ化し、ListIdそれらをそれぞれ個別のバケットに入れる方法はありますか。つまり、ListId1バケットにはすべてのアイテムがListId == 1. リストは SQL から動的に返されるため、いくつになるかは事前にわかりませんListId

4

5 に答える 5

23

GroupByを使用できます:

var groups = items.GroupBy(item => item.ListId);

foreach(var group in groups)
{
     Console.WriteLine("List with ID == {0}", group.Key);
     foreach(var item in group)
        Console.WriteLine("    Item: {0}", item.ItemName);
}
于 2011-07-08T01:07:21.377 に答える
15

アイテムのリストを作成しましょう。

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>>IGroupingIGroupingIEnumerable<>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...
    }
}
于 2015-05-15T11:22:09.983 に答える