LINQ – GroupBy键,然后将每个分组项目放入单独的“桶”中

我有一个项目列表:

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

您可以使用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); } 

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

 List items = new List(); 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调用之后, groupByResultIEnumerable>类型的变量,它基本上是实现IGrouping接口的对象的集合。 这允许您迭代所有项目,因为IGrouping是从IEnumerable<>派生的,并且有一个名为Key的额外字段:

 public interface IGrouping : IEnumerable, IEnumerable { TKey Key { get; } } 

简而言之, GroupBy方法调用返回列表列表 。 外部列表对应于您在问题中提到的“桶”。 然后每个“桶”包含与该“桶”对应的项目。 为了特定于您的示例, groupByResult的值在此屏幕截图中描述。 我们可以看到,您的初始集合分为三个不同的桶,分别有3个,2个和3个项目。

至于访问这些组中的项目,您可以使用简单的LINQ:

 List firstBucketItems = groupByResult.First(i => i.Key == 1).ToList(); List secondBucketItems = groupByResult.First(i => i.Key == 2).ToList(); List thirdBucketItems = groupByResult.First(i => i.Key == 3).ToList(); 

第一桶产品

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

 foreach (var itemGroup in groupByResult) { int groupKey = itemGroup.Key; foreach (Item item in itemGroup) { // Do whatever... } } 
  IList studentList = new List() { 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); }