public class Item{ public int Id {get; set;} public bool Selected {get; set;}}List<Item> itemList = new List<Item>(){ /* fill with items */ };我需要创建满足以下条件的项目列表。从itemList,我需要按Id对项目进行分组,然后从每个组中选择一个项目。所选项目必须是其中Selected == true的项目。如果组中没有项目被选中,则可以选择任何项目,这无关紧要,但是必须选择一个。基于此问题:How to get distinct instance from a list by Lambda or LINQ我能够汇总以下内容,这似乎可行:var distinctList = itemList.GroupBy(x => x.Id, (key, group) => group.Any(x => x.Selected) ? group.First(x => x.Selected) : group.First());有没有更有效或更简单的方法来实现这一目标?我尝试了FirstOrDefault(),但似乎无法使其满足我的需要。我对上面代码中的效率的关注是对Any()的调用。 最佳答案 您确实可以使用FirstOrDefault extension method,但可以使用version that takes a predicate,并将其与coalesce operator (??)结合使用,就像这样(我在这里使用了查询语法来简化操作):var distinctList = from item in itemList group item by item.Id into g select g.FirstOrDefault(i => i.Selected) ?? g.First();使用FirstOrDefault中的谓词,您将选择Selected属性为true的第一项。如果没有,则假定您的类型是引用类型(这对于使用FirstOrDefault是很重要的),它将返回null。如果返回null,那么您将只返回组中的第一个项目(通过调用First),因为可以返回任何项目,并且其中没有项目就不能存在一个组(因此,调用始终保证成功)。基本上,您是将选择器应用于分组的结果,而不是在分组时。