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
调用之后, groupByResult
是IEnumerable
类型的变量,它基本上是实现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); }