如何比较两个列表中的项目?
本文关键字:列表 项目 两个 何比较 比较 | 更新日期: 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
。