当我在我的收藏中有重复项时,我想返回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)。
答案 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)