如何遍历列表并检查两个对象是否相等

时间:2018-04-14 11:44:51

标签: c# list

寻找更加压缩的版本来检查列表中两个类是否相等。

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;
}

4 个答案:

答案 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)的时间复杂度迭代列表一次