【问题标题】:What is the best way to compare 2 integer lists / array in C#在 C# 中比较 2 个整数列表/数组的最佳方法是什么
【发布时间】:2011-08-11 14:45:30
【问题描述】:

我想比较 2 个整数列表是否相等。如果这样做更容易,我很乐意提前对它们进行分类。这是我想比较的两件事的一个例子。对于以下内容,我希望结果为真。

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

 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 - 查看更新的问题,没有重复值
  • @leora 如果您的收藏永远不会重复,请随身携带HashSet&lt;T&gt;。它更好地揭示了你的意图。

标签: c# arrays integer


【解决方案1】:

比较列表时,相等对您意味着什么?您是否关心列表完全相同....相同顺序的相同项目?或者只包含相同的一组值,而不考虑顺序。

如果你真的想验证列表是否包含相同顺序的相同值序列,你可以使用 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 );

如果重复并不重要,并且您有兴趣避免比较费用(排序、构建哈希集等),您可以首先比较两个集合的大小,然后仅比较它们是否是一样。

【讨论】:

  • 我更新了这个问题,以便更清楚地了解我所说的平等。默认情况下它们的顺序不同,但我总是可以按照我在问题中提到的那样预先对它们进行排序
  • @ooo:这还是有点模棱两可——看我的回答。
【解决方案2】:

您似乎想将它们作为 sets 进行比较...在这种情况下:

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

请注意,这会将 { 1, 2, 2, 3 } 和 { 1, 3, 2, 3, 1 } 视为相等。这就是你想要的吗?

几乎可以肯定,内置的东西可以满足您的需求,但您的描述需要准确:)

编辑:正如您所说,不会有重复的元素,这应该没问题。不过,记录这个假设可能是明智的。

【讨论】:

  • 在我的情况下,数字将始终是不同的(没有重复值),但它们的顺序可能不同。这就是为什么我提到我可以预先对其进行排序,这样会更容易
  • @ooo:如果你知道它们是不同的,那么如果你排序,这种方法应该是 O(n) 而不是 O(n log n),所以我可能会使用它。我会记录它确实假设是不同的(或者你不关心重复)。
  • Intersect() 执行集合交集时为什么要创建一个单独的HashSet?
  • @manojlds:好吧,无论如何,这将在内部创建一个哈希集,而且目前还不清楚您实际上要测试什么,IMO。 (哦,使用 Intersect 会产生错误的结果。请参阅我对您的答案的评论。)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-01
  • 2021-12-23
相关资源
最近更新 更多