Как проверить, содержит ли коллекция все уникальные объекты - PullRequest
2 голосов
/ 01 декабря 2010

У меня есть коллекция объектов C #, которые не поддерживают IEquatable или IComparable. Я хочу проверить, содержит ли коллекция дубликаты объектов. То есть Я хочу знать, является ли Object.ReferenceEquals (x, y) ложным для любых x и y в моем списке.

Как бы я сделал это эффективно?

Было бы неплохо как с C #, так и с методом LINQ.

Ответы [ 2 ]

6 голосов
/ 01 декабря 2010

Non-LINQ, когда ваша коллекция реализует ICollection<T> или ICollection:

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

Non-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();
4 голосов
/ 01 декабря 2010

Я бы предложил вам использовать

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

Прибыль: итерация по коллекции остановится, как только будет найден первый дубликат объекта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...