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

Gar*_*ghi 1 c# linq-to-objects c#-4.0

当我在我的集​​合中有重复项时,我想返回true,否则,我想返回false.

我有以下linq查询.

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

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

Eri*_*ert 11

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

那很容易解决:

bool hasDupes = t.Any();
Run Code Online (Sandbox Code Playgroud)

如果有多个真理,那就是真的.如果没有,那就错了.

但是坦率地说,我倾向于简单地编写我自己的扩展方法,当它找到第一个副本时保释,而不是构建一组所有重复项然后查询该组:

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;
}
Run Code Online (Sandbox Code Playgroud)

现在就说

bool dupes = selectedDrivers.HasDuplicates();
Run Code Online (Sandbox Code Playgroud)

十分简单.

  • @Garth:HashSets有一个很好的属性,它插入一个新项目非常快,并且检查项目是否存在非常快.在这种情况下,我使用该集作为"我已经看到的所有东西"的记录,我需要快速的两个操作正是那些:插入一个新项目,或告诉我项目是否已经存在. (4认同)
  • 扩展方法中的一个可能的优化是使用"Add"返回的事实,如果集合中已经存在,则允许您省略`Contains`调用.但另一方面,这种改变降低了可读性.`if(!set.Add(item))返回true;` (3认同)