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>>它基本上是实现IGrouping接口的对象的集合。这允许您遍历所有项目,这些项目IGrouping源自IEnumerable<>并具有一个名为 的额外字段Key

public interface IGrouping<out TKey, out TElement> : IEnumerable<TElement>, IEnumerable
{
    TKey Key { get; }
}

简而言之,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();

第一桶项目

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

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

    foreach (Item item in itemGroup)
    {
        // Do whatever...
    }
}
于 2015-05-15T11:22:09.983 回答
0
    IList<Student> studentList = new List<Student>()
    { 
    new Student() { StudentID = 1, StudentName = "John", Age = 18 } ,
    new Student() { StudentID = 2, StudentName = "Steve",  Age = 21 } ,
    new Student() { StudentID = 3, StudentName = "Bill",  Age = 18 } ,
    new Student() { StudentID = 4, StudentName = "Ram" , Age = 20 } ,
    new Student() { StudentID = 5, StudentName = "Abram" , Age = 21 } 
    };

var groupedResult = from s in studentList group s by s.Age;

//迭代每个组

foreach (var ageGroup in groupedResult)
{
    Console.WriteLine("Age Group: {0}", ageGroup.Key); //Each group has a key 

    foreach(Student s in ageGroup) // Each group has inner collection
        Console.WriteLine("Student Name: {0}", s.StudentName);
}
于 2018-05-22T12:06:45.950 回答
0

基本格式

  var res = (from i in items
                           group i by i.ListId into g
                           select  );
于 2020-08-12T07:45:14.573 回答
0

您也可以通过以下方式执行此操作

using System;
using System.Collections.Generic;
using System.Linq;

public class Program
{
    public static void Main()
    {
        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);
        List<GroupedItems> betterGroups = new List<GroupedItems>();
        foreach (var groupedItem in groupByResult)
        {
            betterGroups.Add(new GroupedItems() { ListId = groupedItem.Key, Items = groupedItem.ToList() });
            // ListId = 1 , List<Item> 3 records 
            // ListId = 2 , List<Item> 2 records
            // ListId = 3 , List<Item> 3 records
            // You can iteratre throught ListId
        }
    }
    
    public class Item
    {
        public int ItemId { get; set; }
        public string ItemName { get; set; }
        public int ListId { get; set; }
    }
    
    public class GroupedItems
    {
        public int ListId {get; set;}
        public List<Item> Items {get; set;}
    }
}

donetFiddle 示例链接

于 2020-12-14T08:03:46.120 回答