Давайте создадим ваш список предметов:
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();
![First bucket items](https://i.stack.imgur.com/6GHPk.png)
Или вы можете просто перебрать все элементы:
foreach (var itemGroup in groupByResult)
{
int groupKey = itemGroup.Key;
foreach (Item item in itemGroup)
{
// Do whatever...
}
}