如何验证集合是否包含所有唯一对象

Hol*_*roe 2 c# collections

我有一个C#集合的对象没有实现IEquatable或IComparable.我想检查集合是否包含重复的对象.即我想知道我的列表中的任何x和y的Object.ReferenceEquals(x,y)是否为false.

我该如何有效地做到这一点?

使用C#和LINQ方法会很好.

Luk*_*keH 6

非LINQ,当您的集合实现ICollection<T>ICollection:

bool allItemsUnique =
    new HashSet<YourType>(yourCollection).Count == yourCollection.Count;
Run Code Online (Sandbox Code Playgroud)

非LINQ,当您的集合未实现ICollection<T>ICollection.(此版本的理论性能略优于第一版,因为一旦找到重复版本,它就会提前爆发.)

bool allItemsUnique = true;

var tempSet = new HashSet<YourType>();
foreach (YourType obj in yourCollection)
{
    if (!tempSet.Add(obj))
    {
        allItemsUnique = false;
        break;
    }
}
Run Code Online (Sandbox Code Playgroud)

LINQ.(此版本的最佳案例性能 - 当您的集合实现ICollection<T>ICollection- 将与第一个非LINQ解决方案大致相同.如果您的集合未实现,ICollection<T>或者ICollectionLINQ版本效率较低.)

bool allItemsUnique =
    yourCollection.Distinct().Count() == yourCollection.Count();
Run Code Online (Sandbox Code Playgroud)