检查IEnumerable <T>以查找具有重复属性的项目

use*_*348 16 c# linq ienumerable

如何检查IEnumerable是否有两个或多个具有相同属性值的项?

例如一个班级

public class Item
{
    public int Prop1 {get;set;}
    public string Prop2 {get;set;}
}
Run Code Online (Sandbox Code Playgroud)

然后是一个类型的集合 IEnumerable<Item>

如果Prop1中有重复值的项,我需要返回false.

dig*_*All 19

您想只检查Prop1吗?

关于什么:

IEnumerable<Item> items = ...
var noDistinct = items.GroupBy(x => x.Prop1).All(x => x.Count() == 1);
// it returns true if all items have different Prop1, false otherwise
Run Code Online (Sandbox Code Playgroud)


Jak*_*son 17

我认为这种方法会起作用.

public static bool ContainsDuplicates<T1>(this IEnumerable<T1> source, Func<T1, T2> selector)
{
    var d = new HashSet<T2>();
    foreach(var t in source)
    {
        if(!d.Add(selector(t)))
        {
            return true;
        }
    }
    return false;
}
Run Code Online (Sandbox Code Playgroud)

  • 方法声明应该是ContainsDuplicates <T,T1>否则代码将无法编译. (4认同)
  • 或者只是`if(!d.Add(selector(t))){return false; 对于循环体而言. (2认同)

Eam*_*nne 16

一个简短的,只列举一个枚举的解决方案是:

public static bool ContainsDuplicates<T>(this IEnumerable<T> list)
    => !list.All(new HashSet<T>().Add);
Run Code Online (Sandbox Code Playgroud)

可以理解为:项目可以转到一个集合时,列表没有重复 All Add.

这在概念上类似于Jake Pearsons解决方案; 然而,它忽略了独立的投射概念; OP的问题将解决为:

items.Select(o => o.Prop1).ContainsDuplicates()
Run Code Online (Sandbox Code Playgroud)


jzm*_*jzm 5

bool x = list.Distinct().SequenceEqual(list);
Run Code Online (Sandbox Code Playgroud)

xtrue如果list有重复项。

  • 一个漂亮且可读的解决方案,但如果我没有错的话,它将导致“list”的多个枚举 (3认同)