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