linq 检查IEnumerable< T>中是否存在具有重复属性的项

dwbf0jvd  于 2023-09-28  发布在  其他
关注(0)|答案(9)|浏览(129)

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

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

然后是IEnumerable<Item>类型的集合
如果Prop1中有重复值的项,我需要返回false。

z4bn682m

z4bn682m1#

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

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

其可以读作:* 当 * All * 项可以 * Add-艾德为一个集合时,列表没有重复项。
这在概念上类似于Jake Pearsons解决方案;但它忽略了独立的投射概念; OP的问题将被解决为:

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

0ve6wy6x2#

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

d7v8vwbk3#

我认为这个方法会奏效。

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

xoshrz7s4#

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

xtrue,如果list有重复。

qyswt5oh

qyswt5oh6#

这可能是为了提高性能,但这是迄今为止唯一正确的答案。

// 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();
alen0pnh

alen0pnh7#

您可以从IEnumerable中选择非重复值,然后根据完整集合的计数检查计数。
范例:

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

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

ua4mk5z48#

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

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

qvk1mo1f

qvk1mo1f9#

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

示例:

我在testtable中有一个createdby列,其中有5个重复条目。我只能坐一排

ID   Createdby
 ===  ======== 
  1    Reddy
  2    Reddy
  3    Reddy
  4    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();

相关问题