【发布时间】:2012-03-25 01:06:01
【问题描述】:
假设有
List<string> a1 = new List<string>();
List<string> a2 = new List<string>();
有没有办法做到这一点?
if (a1 == a2)
{
}
【问题讨论】:
-
您到底希望它做什么?如果两个列表具有相同的值且顺序相同,则返回 true?
假设有
List<string> a1 = new List<string>();
List<string> a2 = new List<string>();
有没有办法做到这一点?
if (a1 == a2)
{
}
【问题讨论】:
您也可以使用Except(产生两个序列的集合差)来检查是否存在差异:
IEnumerable<string> inFirstOnly = a1.Except(a2);
IEnumerable<string> inSecondOnly = a2.Except(a1);
bool allInBoth = !inFirstOnly.Any() && !inSecondOnly.Any();
因此,如果顺序和重复的数量无关紧要(与接受的答案 SequenceEqual 相反),这是一种有效的方法。演示:Ideone
如果您想以不区分大小写的方式进行比较,只需添加StringComparer.OrdinalIgnoreCase:
a1.Except(a2, StringComparer.OrdinalIgnoreCase)
【讨论】:
Except 的两个潜在问题:它只会返回 a1 中不存在于 a2 中的项目 - 所以如果 a2 包含额外的项目,这将返回假阴性。其次,它不考虑同一项目的重复,只考虑存在。仍然是一个强大的工具,只是需要小心使用。
【讨论】:
IEqualityComparer 并将其作为第二个参数提供(例如a IgnoreCase comparer for string)。
using System.Linq 指令。另请查看我发布的 ideone 链接以查看完整的示例。您应该能够将其复制并粘贴到您的 IDE 中并运行它。
null,这将引发异常。
private static bool CompareDictionaries(IDictionary<string, IEnumerable<string>> dict1, IDictionary<string, IEnumerable<string>> dict2)
{
if (dict1.Count != dict2.Count)
{
return false;
}
var keyDiff = dict1.Keys.Except(dict2.Keys);
if (keyDiff.Any())
{
return false;
}
return (from key in dict1.Keys
let value1 = dict1[key]
let value2 = dict2[key]
select value1.Except(value2)).All(diffInValues => !diffInValues.Any());
}
【讨论】:
我发现SequenceEqual 并不是比较两个字符串列表的最有效方法(最初来自http://www.dotnetperls.com/sequenceequal)。
我想自己测试一下,所以我创建了两种方法:
/// <summary>
/// Compares two string lists using LINQ's SequenceEqual.
/// </summary>
public bool CompareLists1(List<string> list1, List<string> list2)
{
return list1.SequenceEqual(list2);
}
/// <summary>
/// Compares two string lists using a loop.
/// </summary>
public bool CompareLists2(List<string> list1, List<string> list2)
{
if (list1.Count != list2.Count)
return false;
for (int i = 0; i < list1.Count; i++)
{
if (list1[i] != list2[i])
return false;
}
return true;
}
第二种方法是我遇到的一段代码,想知道是否可以将其重构为“更易于阅读”。 (并且还想知道 LINQ 优化是否会更快。)
事实证明,两个包含 32k 字符串的列表,超过 100 次执行:
为了简洁、性能和代码可读性,我通常更喜欢 LINQ;但在这种情况下,我认为基于循环的方法是首选。
编辑:
我使用优化的代码重新编译,并运行了 1000 次迭代的测试。结果仍然有利于循环(更是如此):
在 Core i7-920 上使用 Visual Studio 2010、C# .NET 4 客户端配置文件进行测试
【讨论】:
.Count 属性。
您可以通过以下所有方式查看列表
List<string> FilteredList = new List<string>();
//Comparing the two lists and gettings common elements.
FilteredList = a1.Intersect(a2, StringComparer.OrdinalIgnoreCase);
【讨论】:
a1 和 a2 匹配。
a1 和 a2 中的不同元素。