寻找更加压缩的版本来检查列表中两个类是否相等。
private bool foo()
{
if (bar.Count <= 0) return false;
for (int i = 0; i < bar.Count; i++)
{
for (int k = 0; k < bar.Count; k++)
{
if (i != k)
{
if (bar[i].Equals(bar[k])) return true;
}
}
}
return false;
}
答案 0 :(得分:5)
使用linq Distinct()方法:
return bar.Count > bar.Distinct().Count();
答案 1 :(得分:0)
您可以使用Linq
查询来查找列表中的重复项,我希望List对象正在实现IComparable
接口。要找出重复的内容,您可以使用以下代码。
var duplicates = bar.GroupBy(b => b)
.SelectMany(grp => grp.Skip(1));
答案 2 :(得分:0)
假设您有两个List<String
,这里有一个示例代码可能会节省您的一天:)
private List<string> checkifMatch(List<string> lst1, List<string> lst2)
{
List<string> matches= new List<string>();
matches.AddRange(lst1.Except(lst2, StringComparer.OrdinalIgnoreCase));
matches.AddRange(lst2.Except(lst1, StringComparer.OrdinalIgnoreCase));
return matches;
}
答案 3 :(得分:0)
是的,所以它总是很有趣的测试性能答案(只是为了好玩)。
所以我将你的版本与Aominè与Dave M的版本所建议的内循环修改进行了比较
<强>〔实施例强>
if (Input.Count <= 0) return false;
for (var i = 0; i < Input.Count; i++)
for (var k = i; k < Input.Count; k++)
if (i != k && Input[i].Equals(Input[k])) return true;
return false;
结果
Test Framework : .NET Framework 4.7.1
Scale : 100
Name | Time | Delta | Deviation | Cycles
--------------------------------------------------------------
Distinct | 0.019 ms | 0.000 ms | 0.06 | 58,785
Yours with mod | 0.036 ms | 0.001 ms | 0.11 | 84,808
Scale : 1000
Name | Time | Delta | Deviation | Cycles
-----------------------------------------------------------------
Distinct | 0.074 ms | 0.023 ms | 0.02 | 240,076
Yours with mod | 1.638 ms | 0.163 ms | 0.09 | 5,560,397
Scale : 10000
Name | Time | Delta | Deviation | Cycles
---------------------------------------------------------------------
Distinct | 0.708 ms | 0.017 ms | 0.05 | 2,400,189
Yours with mod | 158.829 ms | 0.000 ms | 8.08 | 540,243,590
摘要:虽然单行和Linq可以使您的可打印角色OCD感觉良好,但有时它们不能很好地扩展并且与性能相反。我认为这个说明了不同的胜利。
正如你可以看到你的指数呈指数级增长,它基本上是因为不同内部使用一个集合并以O(n)的时间复杂度迭代列表一次