使用LINQ查找多个属性的重复项

Cat*_*top 20 .net c# linq duplicate-removal

给定具有以下定义的类:

public class MyTestClass
{
    public int ValueA { get; set; }
    public int ValueB { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

如何在MyTestClass []数组中找到重复值?

例如,

MyTestClass[] items = new MyTestClass[3];
items[0] = new MyTestClass { ValueA = 1, ValueB = 1 };
items[1] = new MyTestClass { ValueA = 0, ValueB = 1 };
items[2] = new MyTestClass { ValueA = 1, ValueB = 1 };
Run Code Online (Sandbox Code Playgroud)

包含副本,因为有两个MyTestClass对象,其中ValueA ValueB都= 1

Hug*_*ron 44

您可以通过ValueA和ValueB对元素进行分组来找到重复项.之后对它们进行计数,你会发现哪些是重复的.

这就是你如何孤立欺骗:

var duplicates = items.GroupBy(i => new {i.ValueA, i.ValueB})
  .Where(g => g.Count() > 1)
  .Select(g => g.Key);
Run Code Online (Sandbox Code Playgroud)

  • 正是我在寻找的!你赢了一个互联网.非常感谢. (2认同)

Dav*_*veH 5

您可以使用 Jon Skeet'sDistinctByExcept一起查找重复项。请参阅此响应以了解他对 的解释DistinctBy

MyTestClass[] items = new MyTestClass[3];
items[0] = new MyTestClass { ValueA = 1, ValueB = 1 };
items[1] = new MyTestClass { ValueA = 0, ValueB = 1 };
items[2] = new MyTestClass { ValueA = 1, ValueB = 1 };

MyTestClass [] distinctItems = items.DistinctBy(p => new {p.ValueA, p.ValueB}).ToArray();
MyTestClass [] duplicates = items.Except(distinctItems).ToArray();
Run Code Online (Sandbox Code Playgroud)

然而,它只会返回一个项目,而不是两个重复项。