我有一个项目清单:
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
。
答案 0 :(得分:20)
您可以使用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);
}
答案 1 :(得分: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);
在此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
屏幕截图中显示了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();
的值。我们可以看到,您的初始集合分为三个不同的桶,分别有3个,2个和3个项目。
至于访问这些组中的项目,您可以使用简单的LINQ:
foreach (var itemGroup in groupByResult)
{
int groupKey = itemGroup.Key;
foreach (Item item in itemGroup)
{
// Do whatever...
}
}
或者您可以遍历所有项目:
CoreData
答案 2 :(得分: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);
}
答案 3 :(得分:0)
基本格式
var res = (from i in items
group i by i.ListId into g
select );
答案 4 :(得分: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示例Link