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

时间:2011-01-04 19:19:02

标签: c# linq ienumerable

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

例如一个类

public class Item
{
    public int Prop1 {get;set;}
    public string Prop2 {get;set;}
}

然后是IEnumerable<Item>

类型的集合

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

9 个答案:

答案 0 :(得分:18)

你想只检查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

答案 1 :(得分:16)

我认为这种方法可行。

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

答案 2 :(得分:15)

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

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

可以理解为: All 项目可以 Add <时,列表没有重复em> -ed to a set。

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

items.Select(o => o.Prop1).ContainsDuplicates()

答案 3 :(得分:4)

答案 4 :(得分:3)

bool x = list.Distinct().SequenceEqual(list);

x如果true有重复项,则为list

答案 5 :(得分:2)

您可以从IEnumerable中选择不同的值,然后根据完整集合的计数检查计数。

示例:

var distinctItemCount = myEnumerable.Select(m => m.Prop1).Distinct().Count();

if(distinctItemCount < myEnumerable.Count())
{
 return false;
}

答案 6 :(得分:2)

这可能是针对表演者的,但这是目前唯一正确的答案。

// Create an enumeration of the distinct values of Prop1
var propertyCollection = objectCollection.Select(o => o.Prop1).Distinct();

// If the property collection has the same number of entries as the object
// collection, then all properties are distinct. Otherwise there are some
// duplicates.
return propertyCollection.Count() == objectCollection.Count();

答案 7 :(得分:0)

public static class EnumerableEx
{
    public static IEnumerable<T> GetDuplicates<T>(this IEnumerable<T> source)
    {
        return source.GroupBy(t => t).Where(x => x.Count() > 1).Select(x => x.Key);
    }
}

就个人而言,我喜欢扩展方法的整洁。 如果你的对象不需要选择器来确定相等性,那么这很好用。

答案 8 :(得分:-1)

我们可以使用.Distinct()中的ArrayList删除重复的条目。

实施例

我在createdby中有一个testtable列,其中包含5个重复条目。我必须只获得一行

 ID   Createdby
 ===  ======== 
  1    Reddy
  2    Reddy
  3    Reddy
  4    Reddy

考虑到上表,我只需要选择一个“Reddy”

DataTable table=new DataTable("MyTable");//Actually I am getting this table data from database

DataColumn col=new DataColumn("Createdby");

var  childrows =  table.AsEnumerable().Select( row => row.Field<object>(col)).Distinct().ToArray();