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

时间:2013-06-18 12:04:40

标签: c# list compare

我遇到了一个似乎无法解决的问题。我有两个相同类型的列表,我需要检查这些列表是否匹配。关于注释for循环和现在使用的nest 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;
}

4 个答案:

答案 0 :(得分:3)

您可以在手动预先检查相等性后使用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);
}

答案 1 :(得分:1)

第二个循环有很多错误,不要使用它^^

您可以使用list1.SequenceEqual(list2)来检查列表相等性(假设订单很重要,它看起来很重要。)

答案 2 :(得分:0)

你不应该使用==,因为默认情况下这是引用相等,听起来你的算法失败了,因为你真的想要价值平等;使用Object.Equals并覆盖它。也就是说,framework does this for you(假设您希望两个列表以相同的顺序具有相同的项目)。用以下内容替换你的循环和所有内容:

return list1.SequenceEqual(list2);

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

或者,有一个overload可让您传递如何比较相等性我需要一些特殊的东西或者不想覆盖Object.Equals

答案 3 :(得分:0)

您正在比较这些索引中列表的引用。你可以这样做 Except运算符将返回一个列表,其中包含两个列表中不存在的元素,即差异。如果您需要将它们用于某些内容,这非常有用

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