我有一个 IList 集合
public IList<MyObject> Items
我可以对该列表进行分组并获取每个组的第一个元素
Items.GroupBy(x => x.Type).Select(grp => grp.First()).ToList();
我怎样才能对该列表进行分组并且不采用第一个元素(例如:第二个)?
您可以使用Enumerable.ElementAt
:
var everySecond = Items.GroupBy(x => x.Type).Select(grp => grp.ElementAt(1)).ToList();
如果没有那么多项目,您可以使用返回 null 的 ElementAtOrDefault
代替(对于引用类型)。
编辑:"我已选择项目,并希望将其作为主元素显示在组中":
所以实际上你想得到第一个符合特定条件的,在这种情况下它是被选中的,你可以对组进行排序并拿第一个:
var everySelected = Items
.GroupBy(x => x.Type)
.Select(grp => grp.OrderByDescending(x => x == selectedItem).First())
.ToList();
我在比较中使用了OrderByDescending
(考虑到 true 是 1,false 是 0)。这样,与所选项目具有相同引用的每个项目都排在第一位(将其替换为您希望如何比较它们的逻辑而不是引用相等性)。