如何在C#中比较两个整数列表/数组的最佳方法?

12

我想比较两个整数列表是否相等。如果事先对它们进行排序可以使操作更加容易,请排序。下面是我想要比较的两个列表的示例。对于下面的内容,我希望结果为true。

注意:列表中永远不会有重复项(没有重复值)。

 List<int> list = new List<int>(){1, 4,6,7};
 int[] myArray = new int[]{1, 6,7 ,4};

根据您的定义,{ 1, 4, 6, 7 } 是否等于 { 1, 4, 4, 6, 7 } - jason
@Jason - 请看更新后的问题,不要有重复的值。 - leora
@leora 如果您的集合永远不会有重复项,则最好使用 HashSet<T>。这样可以更清晰地表达您的意图。 - nawfal
2个回答

26
你在比较两个列表时,“相等”这个概念对你来说意味着什么?你关心这两个列表是否完全相同,即包含相同的元素并且顺序也一致吗?还是只要它们包含相同的值集合即可,无论顺序如何?
如果你想要验证两个列表是否按照相同顺序包含相同的值,可以使用LINQ中的SequenceEqual()方法。
bool areEqual = listA.SequenceEqual( listB );
如果列表不是按相同的顺序排列,您可以先对它们进行排序:
bool areEqual = listA.OrderBy(x=>x).SequenceEqual( listB.OrderBy(x=>x) );

如果列表中可能包含重复项,而这些重复项在相等性方面并不重要,则可以使用集合比较:

bool setEqual = new HashSet<int>( listA ).SetEquals( listB );

如果重复项不重要,并且您想避免比较的开销(排序、构建哈希集等等),您可以首先比较两个集合的大小,只有在它们相同的情况下才进行比较。


我更新了问题,以更清楚地表达我的“相等”的含义。它们默认情况下不是按相同顺序排列的,但我可以像在问题中提到的那样事先对它们进行排序。 - leora
@ooo:这仍然有些含糊不清-请看我的答案。 - Jon Skeet

7

看起来您想将它们作为集合进行比较...这种情况下:

HashSet<int> hashSet = new HashSet<int>(list);
if (hashSet.SetEquals(myArray))
{
    ...
}

请注意,这将把{1,2,2,3}和{1,3,2,3,1}视为相等。这符合您的要求吗?
几乎肯定有内置的功能可以做到您想要的,但您需要在描述中非常精确 :)
编辑:由于您已经说明不会有重复的元素,所以这应该没问题。不过最好记录一下这个假设。

在我的情况下,数字将始终是不同的(没有重复值),但它们可能不会事先以相同的顺序出现。这就是为什么我提到我可以事先排序,这会使它更容易。 - leora
如果你知道它们是不同的,那么这种方法应该是O(n),而不是O(n log n)如果你进行排序,所以我可能会使用这种方法。我会记录它假定不同性(或者你不关心重复)。 - Jon Skeet
当Intersect()执行集合交集时,为什么要创建一个单独的HashSet? - manojlds
@manojlds:嗯,那样会在内部创建一个哈希集合,而且我认为你实际上想要测试什么并不是很清楚。(哦,使用Intersect会得到错误的结果。请参见我对你的答案的评论。) - Jon Skeet

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接