让我们创建您的项目列表:
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...
}
}