在C#中,我可以使用类似的东西:
List<string> myList = new List<string>();
if (myList.Count != myList.Distinct().Count())
{
// there are duplicates
}
Run Code Online (Sandbox Code Playgroud)
检查列表中的重复元素.但是,当null
列表中有项目时,会产生误报.我可以使用一些缓慢的代码来做到这一点,但有没有办法检查列表中的重复项,同时忽略空值的简洁方式?
Raw*_*ing 56
如果您担心性能,以下代码将在找到第一个重复项时立即停止 - 到目前为止所有其他解决方案都要求整个输入至少迭代一次.
var hashset = new HashSet<string>();
if (myList.Where(s => s != null).Any(s => !hashset.Add(s)))
{
// there are duplicates
}
Run Code Online (Sandbox Code Playgroud)
hashset.Add
返回false
如果该项目已经存在于集,并Any
返回true
只要第一个true
值出现,所以这只是会尽量搜索输入作为第一个重复.
Dav*_*ish 32
我会这样做:
鉴于Linq语句将被懒惰地评估,.Any
意味着短路 - 意味着你不必迭代和计算整个列表,如果有重复 - 并且因此,应该更有效.
var dupes = myList
.Where(item => item != null)
.GroupBy(item => item)
.Any(g => g.Count() > 1);
if(dupes)
{
//there are duplicates
}
Run Code Online (Sandbox Code Playgroud)
编辑:http://pastebin.com/b9reVaJu一些Linqpad基准测试似乎结束GroupBy
了Count()
更快
编辑2:罗林的答案似乎至少比这种方法快5倍!
Joe*_*Joe 11
var nonNulls = myList.Where(x => x != null)
if (nonNulls.Count() != nonNulls.Distinct().Count())
{
// there are duplicates
}
Run Code Online (Sandbox Code Playgroud)