根据是否有重复返回true或false

时间:2011-06-30 18:09:38

标签: c# c#-4.0 linq-to-objects

当我在我的收藏中有重复项时,我想返回true,否则,我想返回false。

我有以下linq查询。

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

问题是,当有多个重复时,它将返回多个trues,如果没有任何重复,则不返回任何内容(应该为false)。

6 个答案:

答案 0 :(得分:11)

  

问题是,当有多个重复时,它将返回多个trues,如果没有任何重复,则不返回任何内容(应该为false)。

这很容易解决:

bool hasDupes = t.Any();

如果有多个真相,那都是真的。如果没有,那就错了。

但坦率地说,当我发现第一个副本时,我倾向于简单地编写自己的扩展方法,而不是构建一组所有重复项,然后查询该集:< / p>

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

轻松自负。

答案 1 :(得分:1)

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

我相信这会解决问题。

答案 2 :(得分:1)

将结果汇总到或。

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

答案 3 :(得分:0)

不是最优化的解决方案,但....

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

答案 4 :(得分:0)

在这里。


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

我使用'group.Skip(1).Any()'来查找至少包含两个元素的组,并避免使用Count()枚举整个组。

答案 5 :(得分:0)

这不如Eric的解决方案好,因为它会对整个枚举进行分组,但这似乎是在这里使用Any的正确方法。

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