首页 > 解决方案 > 使用 LINQ 获取具有相同值属性的所有对象?

问题描述

我有一个这样的项目列表:

Item1: Id=1, Name="name1"
Item2: Id=2, Name="name1"
Item3: Id=3, Name="Test2"

我想要执行的是得到这样的减少列表:

Item1: Id=1, Name="name1"
Item2: Id=2, Name="name1"

所以基本上我想要拥有与给定属性具有相同值的项目。因此,所有具有相同属性值的项目。

我试图将它们分组,但我不知道下一步该做什么。

items.OrderBy(x => x.Name);

编辑解释。

似乎我不明白这个问题。答案是预期的,但这里已经有一个解决方案:

正确答案!

标签: c#linq

解决方案


使用此输入...

Item1: Id=1, Name="name1"
Item2: Id=2, Name="name1"
Item3: Id=3, Name="name3"
Item4: Id=4, Name="Test2"
Item5: Id=5, Name="name1"
Item6: Id=6, Name="name3"

...这使所有项目多次发生:

var result = items
    .GroupBy(x => x.Name)        // Group by name
    .Where(g => g.Count() > 1)   // Select only groups having duplicates
    .SelectMany(g => g);         // Ungroup (flatten) the groups

结果:

Item1: Id=1, Name="name1"
Item2: Id=2, Name="name1"
Item5: Id=5, Name="name1"
Item3: Id=3, Name="name3"
Item6: Id=6, Name="name3"

...这会让所有项目不止一次出现并重新编号

var result = items
    .GroupBy(x => x.Name)        // Group by name
    .Where(g => g.Count() > 1)   // Select only groups having duplicates
    .SelectMany(g => g)          // Ungroup (flatten) the groups
    .Select((x, i) => new Item { Id = i + 1, Name = x.Name });

结果:

Item1: Id=1, Name="name1"
Item2: Id=2, Name="name1"
Item3: Id=3, Name="name1"
Item4: Id=4, Name="name3"
Item5: Id=5, Name="name3"

请注意,它Select有一个提供从零开始的索引的重载。

Select<TSource,TResult>(IEnumerable<TSource>, Func<TSource,Int32,TResult>)

但是,您的示例输入过于简单,因此很难说出您期望在更复杂的情况下会发生什么。

如果您想要具有特定名称的条目:

string specificName = "name1";
var result = items
    .Where(x => x.Name == specificName);

推荐阅读