如何比较两个列表中的项目?

本文关键字:列表 项目 两个 何比较 比较 | 更新日期: 2023-09-27 18:18:48

我遇到了一个问题,我似乎无法理解。我有两个相同类型的列表,我需要检查这些列表是否匹配。我遇到了一个问题,关于被注释掉的for循环和现在使用的嵌套foreach循环。我不需要两个都用,一个是我想弄清楚的。

我已经通过调试器运行了这个,发现两个列表都有相同的数据,我假设(使用VS2010调试器)是在列表中的相同元素。但是,当循环遍历时,它在第一个元素处失败。

我从类似的问题中研究了这一点,我对LINQ表达式不是很熟悉(我在业余时间做了一个笔记来研究)。

private bool ListMatch(List<T> list1, List<T> list2) 
    {
        if (list1 == null && list2 == null)
        {
            return true;
        }
        if ((list1 == null) || (list2 == null))
        {
            return false;
        }
    if (list1.Count != list2.Count)
    {
        return false;
    }
    if( list1.Equals( list2 ) )
    {
        return true;
    }
    /*for (var idx = 0; idx < list1.Count; idx++)
    {
        if( list1[ idx ] != list2[ idx ] )
        {
            return false;
        }
    }*/
    foreach( var x in list1 )
    {
        bool hasDuplicates = false;
        foreach( var y in list2 )
        {
            if( x == y )
            {
                hasDuplicates = true;
                break;
            }
        }
        if( hasDuplicates )
        {
            return true;
        }
        return false;
    }
    return true;
}

如何比较两个列表中的项目?

您可以使用Enumerable。在手动预检查相等性后的SequenceEqual:

private bool ListMatch(List<T> list1, List<T> list2) 
{
    if (list1 == null && list2 == null)        
        return true;
    if ((list1 == null) || (list2 == null))        
        return false;        
    if (list1.Count != list2.Count)    
        return false;    
    if(list1.Equals(list2))        
        return true;
    return Enumerable.SequenceEqual(list1, list2);
}

第二个循环有很多bug,不要使用^^

您可以使用list1.SequenceEqual(list2)来检查列表是否相等(假设顺序很重要,看起来很重要)。

您正在比较这些索引中列表的引用。你可以这样做Except操作符将返回一个列表,其中包含两个列表中都不存在的元素,即差异。这在你需要使用它们的时候很有用

List<T> result = list1.Except(list2).ToList();
if (result.count == 0)
//No differences
return true;
else
//Differences
return false;

你不应该使用==,因为默认情况下这是引用相等,这听起来像你的算法失败,因为你真的想要值相等;使用Object.Equals并覆盖它。也就是说,框架会为您完成这项工作(假设您希望这两个列表具有相同顺序的相同项)。用:

替换你的循环和之后的所有内容
return list1.SequenceEqual(list2);

您需要确保为列表中的元素类型覆盖Object.Equals(或者它们实现IEquatable<T>),否则您将遇到与代码中的问题之一相同的问题。

或者,有一个重载,让你传递如何比较相等,如果你需要一些特殊的东西或不想覆盖Object.Equals