C# 根据是否存在重复项返回true或false
当我的集合中有重复项时,我希望返回true,否则,我希望返回false 我有以下linq查询C# 根据是否存在重复项返回true或false,c#,c#-4.0,linq-to-objects,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; 但问题是,当有多个重复项时,它将返回多个true,如果没有任何重复项,它将不返回任何内容(应该是false) 我相信这会成功的 我相信这会起
var t = from i in selectedDrivers
group i by i.Value into g
where g.Count() > 1
select g.Count() > 1;
但问题是,当有多个重复项时,它将返回多个true,如果没有任何重复项,它将不返回任何内容(应该是false)
我相信这会成功的
我相信这会起作用。不是最理想的解决方案,但
var t = selectedDrivers.Distinct().Count() != selectedDrivers.Count();
不是最理想的解决方案,但是
var t = selectedDrivers.Distinct().Count() != selectedDrivers.Count();
在or中汇总您的结果
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);
在or中汇总您的结果
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);
给你
var t = selectedDrivers
.GroupBy(item => item.Value)
.Any(group => group.Skip(1).Any());
我使用了“group.Skip(1).Any()”来查找至少包含两个元素的组,并避免使用Count()枚举整个组。在这里
var t = selectedDrivers
.GroupBy(item => item.Value)
.Any(group => group.Skip(1).Any());
我使用“group.Skip(1).Any()”查找至少包含两个元素的组,并避免使用Count()枚举整个组
但问题是,当有多个重复项时,它将返回多个true,如果没有任何重复项,它将不返回任何内容(应该是false)
这很容易解决:
bool hasDupes = t.Any();
如果有多个真的,那就是真的。如果没有,那就是假的
但坦率地说,我倾向于简单地编写自己的扩展方法,在找到第一个副本时退出,而不是建立一个包含所有副本的集合,然后查询该集合:
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;
}
简单的豌豆
但问题是,当有多个重复项时,它将返回多个true,如果没有任何重复项,它将不返回任何内容(应该是false)
这很容易解决:
bool hasDupes = t.Any();
如果有多个真的,那就是真的。如果没有,那就是假的
但坦率地说,我倾向于简单地编写自己的扩展方法,在找到第一个副本时退出,而不是建立一个包含所有副本的集合,然后查询该集合:
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;
}
简单明了。这没有Eric的解决方案好,因为它将对整个枚举进行分组,但这似乎是在此处使用
任何
的正确方法
var t = selectedDrivers
.GroupBy(item => item.Value)
.Any(group => group.Count() > 1)
这不如Eric的解决方案好,因为它将对整个枚举进行分组,但在这里使用
Any
似乎是正确的方法
var t = selectedDrivers
.GroupBy(item => item.Value)
.Any(group => group.Count() > 1)
谢谢但这是难以置信的无效。谢谢。这是难以置信的无效。接近,但没有雪茄;-)当我没有重复项时,它仍然会返回true。我希望它为false.interest-.Any()仅当存在记录时才应返回true。哦,我想知道。。。删除最后一个>1-我刚刚意识到它正在将最后一位作为布尔值进行计算,因此即使返回了0条记录,0>1=false和false也是一个结果,因此Any=true。关闭,但没有雪茄;-)当我没有重复项时,它仍然会返回true。我希望它为false.interest-.Any()仅当存在记录时才应返回true。哦,我想知道。。。删除最后一个>1-我刚刚意识到它正在将最后一位作为布尔值进行计算,因此即使返回了0条记录,0>1=false和false也是一个结果,因此Any=true。这是我忘记添加的内容-当它发现重复项时,应该足够并返回了。谢谢你的回答!也许有一个问题?我看到您使用了哈希集。开始阅读并想知道为什么要使用它?@Garth:hashset有一个很好的特性,即插入一个新项目非常快,检查一个项目是否存在非常快。在这种情况下,我使用集合作为“我已经看到的一切”的记录,我需要快速执行的两个操作正是:插入一个新项,或者告诉我一个项是否已经存在。扩展方法中一个可能的优化是使用
Add
返回集合中是否已经存在的事实,允许您省略包含的调用。但另一方面,这种变化降低了可读性<代码>如果(!set.Add(item))返回true代码>@CodeInChaos:很好的观点。我通常不喜欢对其副作用和价值都有用的表达式,但如果集合很大且没有副本,则可能会获得真正的性能优势。这是我忘记添加的内容-当它找到副本时,应该足够了,然后返回。谢谢你的回答!也许有一个问题?我看到您使用了哈希集。开始阅读并想知道为什么要使用它?@Garth:hashset有一个很好的特性,即插入一个新项目非常快,检查一个项目是否存在非常快。在这种情况下,我使用集合作为“我已经看到的一切”的记录,我需要快速执行的两个操作正是:插入一个新项,或者告诉我一个项是否已经存在。扩展方法中一个可能的优化是使用Add
返回集合中是否已经存在的事实,允许您省略包含的调用。但另一方面,这种变化降低了可读性<代码>如果(!set.Add(item))返回true代码>@CodeInChaos:很好的观点。我通常不喜欢对其副作用和价值都有用的表达式,但如果集合很大且没有重复项,那么在这里可能会获得真正的性能优势。