【问题标题】:How to return true when comparing arrays with same items but in random positions?比较具有相同项目但随机位置的数组时如何返回true?
【发布时间】:2019-04-20 12:04:15
【问题描述】:

比较两个数组。 如果第一个数组与第二个数组具有相同的项,则返回 true,即使它们位于不同的位置。 这里有两个可能的数组:

int[] arrayA = { 1, 2, 3 };
int[] arrayB = { 3, 2, 1 };

我只能找到 arrayB 在 arrayA 中是否有一个数字。

【问题讨论】:

标签: c# arrays compare


【解决方案1】:

您可以使用SequenceEqual 方法 (LINQ)。

bool areEqual = arrayA.OrderBy(n => n).SequenceEqual(arrayB.OrderBy(n => n));

【讨论】:

  • 这个比arrayA.ToHashSet().SetEquals(arrayB)贵。
  • @canton7 它可能更昂贵,但它仍然是可取的,因为它会产生正确的结果。相反,set1.SetEquals(set2) 会错误地报告数组 { 1, 2, 1 } 和 { 1, 2, 2 } 相等,因为它忽略了重复元素。
  • 非常正确。有一些方法可以使用字典,并且不要求您的项目具有可比性。
  • @canton7 同意。
  • @canton7 您可能希望使用字典提供高效且正确的实现。我已经提供了一个答案,我认为提供第二个答案是不对的。
【解决方案2】:

解决此问题的一种方法是从每个数组创建一个HashSet<int>,然后使用.SetEquals(HashSet<int> hashSet) 检查它们是否具有相同的值。

public static bool CompareArrays(int[] array1, int[] array2)
{
    // Create sets using Linq
    HashSet<int> set1 = array1.ToHashSet();
    HashSet<int> set2 = array2.ToHashSet();
    // Compare the sets with .SetEquals()
    return set1.SetEquals(set2);
}

【讨论】:

  • set2 不需要是 HashSet -- HashSet&lt;T&gt;.SetEquals 需要 IEnumerable&lt;T&gt;
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-31
  • 1970-01-01
相关资源
最近更新 更多