2

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

4 回答 4

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);
}
于 2013-06-18T12:10:04.953 回答
1

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

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

于 2013-06-18T12:09:57.820 回答
0

你不应该使用==默认的引用相等,听起来你的算法失败了,因为你真的想要值相等;使用Object.Equals并覆盖它。也就是说,框架会为您执行此操作(假设您希望两个列表以相同的顺序具有相同的项目)。将您的循环和之后的所有内容替换为:

return list1.SequenceEqual(list2);

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

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

于 2013-06-18T12:10:26.027 回答
0

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

List<T> result = list1.Except(list2).ToList();
if (result.count == 0)
//No differences
return true;
else
//Differences
return false;
于 2013-06-18T12:11:59.673 回答