Вернуть true или false в зависимости от наличия дубликатов - PullRequest
1 голос
/ 30 июня 2011

Когда в моей коллекции есть дубликаты, я хочу вернуть true, в противном случае я хочу вернуть false.

У меня следующий запрос linq.

var t = from i in selectedDrivers
        group i by i.Value into g
        where g.Count() > 1
        select g.Count() > 1;

ПроблемаТем не менее, при наличии нескольких дубликатов он будет возвращать несколько истинных значений, а если дубликатов нет, он ничего не возвращает (должно быть ложным).

Ответы [ 6 ]

11 голосов
/ 30 июня 2011

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

Ну, это легко решить:

bool hasDupes = t.Any();

Если есть несколько истин, это будет правдой.Если их нет, это будет ложь.

Но, честно говоря, я бы склонялся просто написать свой собственный метод расширения, который выдает сообщение, когда он находит дубликат first , а не создаватьнабор всех дубликатов, а затем запрашивает этот набор:

static bool HasDuplicates<T>(this IEnumerable<T> sequence)
{
    var set = new HashSet<T>();
    foreach(T item in sequence)
    {
        if (set.Contains(item))
            return true;
        set.Add(item);
    }
    return false;
}

А теперь просто скажите

bool dupes = selectedDrivers.HasDuplicates();

Легко, peasy.

1 голос
/ 30 июня 2011

Объедините ваши результаты в или.

var q=from i in selectedDrivers
    group i by i.Value into g
    where g.Count() > 1
    select g.Count() > 1

return q.Aggregate(false,(x,y)=>x|y);
1 голос
/ 30 июня 2011
var t = (from i in selectedDrivers
    group i by i.Value into g
    where g.Count() > 1
    select g.Count() > 1).Any();

Я верю, что это поможет.

0 голосов
/ 30 июня 2011

Это не так хорошо, как решение Эрика, потому что оно сгруппирует все перечисления, но это похоже на правильный способ использования Any здесь.

var t = selectedDrivers
    .GroupBy(item => item.Value)
    .Any(group => group.Count() > 1)
0 голосов
/ 30 июня 2011

Вот оно.


var t = selectedDrivers
    .GroupBy(item => item.Value)
    .Any(group => group.Skip(1).Any());

Я использовал 'group.Skip (1) .Any ()', чтобы найти группу по крайней мере с двумя элементами и избежать перечисления всей группы с помощью Count ()..

0 голосов
/ 30 июня 2011

Не самое оптимальное решение, но ....

var t = selectedDrivers.Distinct().Count() != selectedDrivers.Count();
...