【发布时间】:2015-01-26 13:00:23
【问题描述】:
我有一个 IList 集合
public IList<MyObject> Items
我可以对该列表进行分组并获取每个组的第一个元素
Items.GroupBy(x => x.Type).Select(grp => grp.First()).ToList();
如何对该列表进行分组而不是第一个元素(例如:第二个)??
【问题讨论】:
标签: c# list linq distinct linq-group
我有一个 IList 集合
public IList<MyObject> Items
我可以对该列表进行分组并获取每个组的第一个元素
Items.GroupBy(x => x.Type).Select(grp => grp.First()).ToList();
如何对该列表进行分组而不是第一个元素(例如:第二个)??
【问题讨论】:
标签: c# list linq distinct linq-group
你可以使用Enumerable.ElementAt:
var everySecond = Items.GroupBy(x => x.Type).Select(grp => grp.ElementAt(1)).ToList();
如果没有太多项目,您可以使用 ElementAtOrDefault 代替返回 null(对于引用类型)。
编辑:“我已选择项目并希望将其显示在组中作为主要元素”:
所以实际上你想得到第一个匹配特定条件的,在这种情况下它是被选中的,你可以订购组并取第一个:
var everySelected = Items
.GroupBy(x => x.Type)
.Select(grp => grp.OrderByDescending(x => x == selectedItem).First())
.ToList();
我使用了OrderByDescending(认为真为1,假为0)进行比较。这样,与您选择的项目具有相同引用的每个项目都会首先出现(将其替换为您想要比较它们的逻辑而不是引用相等)。
【讨论】: