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

时间:2010-12-01 11:51:20

标签: c# collections

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

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

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

2 个答案:

答案 0 :(得分:6)

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

bool allItemsUnique =
    new HashSet<YourType>(yourCollection).Count == yourCollection.Count;

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

bool allItemsUnique = true;

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

LINQ。 (此版本的最佳案例性能 - 当您的集合实现ICollection<T>ICollection时 - 将与第一个非LINQ解决方案大致相同。如果您的集合未实现ICollection<T>ICollection然后LINQ版本的效率会降低。)

bool allItemsUnique =
    yourCollection.Distinct().Count() == yourCollection.Count();

答案 1 :(得分:4)

我建议你使用

collection.GroupBy(x=>x).Any(x=>x.Count() != 1)

利润是:迭代收集将很快停止,因为将找到第一个复制对象。