【问题标题】:How compare two arrays and count equal items in c#如何在c#中比较两个数组并计算相等的项目
【发布时间】:2019-01-08 13:17:38
【问题描述】:

我有两个数组:{1, 2, 3, 4, 5} 和 {1, 3, 3, 6, 5}。

要找出许多相似的项目(在同一位置),我这样做:

int[] a = new int[5] {1, 2, 3, 4, 5};
int[] b = new int[5] {1, 3, 3, 6, 5};
int count = 0;
for(int i = 0; i < 5; i++)
{
    if(a[i] == b[i])
      count++;
}
Console.Write(count);

这将给出结果 3。

有没有更好(更快)的方法来做到这一点?

【问题讨论】:

  • 您可以对其进行卷积以减少代码,但除非有充分的理由我会说不要打扰。它很好,并且以非常清晰的方式完全满足您的需求。
  • @Archer 在b.Length &gt; a.Length 的情况下IndexOutOfRangeException 的危险如何-除此之外,我会避免迭代到固定值
  • 我建议您添加类似int n = Math.Max(a.Length, b.Length) 的内容,然后使for 循环看起来像:for(int i = 0; i &lt; n; i++)。除此之外,您的代码在可读性和性能方面可能是最佳的。
  • @fubo 这个例子中有很多不应该存在的硬编码值。这显然是一个问题示例,而不是生产代码。

标签: c# arrays compare


【解决方案1】:

Linq Zip() 是一种方式

int equalElements = a.Zip(b, (i, j) => i == j).Count(eq => eq);

【讨论】:

  • 单线和一些安全性(索引和边界)很好,但不会让意图变得如此模糊。这段代码不会通过大多数代码审查,应该是自定义方法,类似于SequenceEqual implementation
【解决方案2】:

Zip 解决方案为基础,但旨在提高可读性:

int[] a = new int[5] {1, 2, 3, 4, 5};
int[] b = new int[5] {1, 3, 3, 6, 5};

var count = a.Zip(b, (x, y) => (X : x, Y : y))
            .Where(t => t.X == t.Y)
            .Count();

这通过将两个数组组合成一个元组序列(X, Y),然后使用Where 仅选择XY 相等的元组。

您需要确保引用 System.ValueTuple 程序集才能使其正常工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-15
    • 2012-02-09
    相关资源
    最近更新 更多