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)
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)
bool x = list.Distinct().SequenceEqual(list);
Run Code Online (Sandbox Code Playgroud)
x是true如果list有重复项。