LINQ - GroupBy键,然后将每个分组项放入单独的"桶"中

Sax*_*man 14 .net c# linq linq-group

我有一个项目列表:

public class Item
{
    public int ItemId { get; set; }
    public string ItemName { get; set; }
    public int ListId { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

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会有多少.

Ree*_*sey 21

您可以使用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);
}
Run Code Online (Sandbox Code Playgroud)


ana*_*lov 10

让我们创建您的项目列表:

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);
Run Code Online (Sandbox Code Playgroud)

在此GroupBy调用之后,groupByResult是一个类型的变量,IEnumerable<IGrouping<int, Item>>它基本上是实现IGrouping接口的对象的集合.这允许您迭代所有项目IGrouping,IEnumerable<>并且有一个名为的额外字段Key:

public interface IGrouping<out TKey, out TElement> : IEnumerable<TElement>, IEnumerable
{
    TKey Key { get; }
}
Run Code Online (Sandbox Code Playgroud)

简而言之,GroupBy方法调用返回列表列表.外部列表对应于您在问题中提到的"桶".然后每个"桶"包含与该"桶"对应的项目.具体到您的示例,屏幕截图groupByResult中描述了值.我们可以看到,您的初始集合分为三个不同的桶,分别有3个,2个和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();
Run Code Online (Sandbox Code Playgroud)

第一桶产品

或者你可以遍历所有项目:

foreach (var itemGroup in groupByResult)
{
    int groupKey = itemGroup.Key;

    foreach (Item item in itemGroup)
    {
        // Do whatever...
    }
}
Run Code Online (Sandbox Code Playgroud)