使用LINQ获取所有具有相同值属性的对象?

4

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

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);

编辑以解释。

看来我没有理解问题。期望答案,但这里已经有一个解决方案:

正确的答案!


请问您打算在列表中放置多少个项目? - Pavel B.
你的示例结果列表正确吗?第二项不应该是 Item2: Id=2, Name="Test2" 吗? - Olivier Jacot-Descombes
1
可能是重复的问题:如何使用LINQ从列表中获取重复项? - Slai
您编辑后的解释仍然有些神秘。项目Id=4和5也具有相同的名称。为什么它们被排除在外? - Olivier Jacot-Descombes
@OlivierJacot-Descombes 您是正确的,这是我的错,误解了问题。 - Bojan Tomić
2个回答

5

使用这个输入...

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);

3

按名称对项目进行分组,然后从每个组中选择第一个项目存储到减少的列表中:

var groupedItems = items.GroupBy(x => x.Name).Select(g => g.First()).ToList();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接