计算2个数组包含相等元素的位置

时间:2017-05-24 07:03:21

标签: c# linq where enumerable

我有2 tuple相同的长度,我需要计算他们的位置包含相同元素的数量。我做了这个功能,但我觉得可以在不创建static int GetCoincidence(int[] a, int[] b) { return a.Zip(b, Tuple.Create).Where(x => x.Item1 == x.Item2).Select(x => 1).Sum(); } 的情况下完成。有更广泛而简单的方法吗?

@ComponentScan()

5 个答案:

答案 0 :(得分:5)

没有Tuple的替代方案(我试图用Sum 保存你的想法):

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

  int count = a
    .Zip(b, (left, right) => left == right ? 1 : 0)
    .Sum();

答案 1 :(得分:3)

这个怎么样:

static int GetCoincidence(int[] a, int[] b)
{
    return a.Where((x,i)=>x==b[i]).Count();
}

试试这个Example用法:

int[] a= {1,2,3,4,55,6,77,7,8,9};
int[] b= {1,2,3,4,34,5,79,7,8,9};
Console.WriteLine(GetCoincidence(a,b));
// Output will be 7

答案 2 :(得分:1)

恕我直言,由于使用Zip()来创建所需的并行枚举,因此您的解决方案相当优雅。另一种方法是明确地自己管理IEnumerator<T>个对象,这不是很好。

我所做的一项更改是使用Count()代替Where()Select()Sum()

static int GetCoincidence(int[] a, int[] b)
{
    return a.Zip(b, Tuple.Create).Count(x => x.Item1 == x.Item2);
}

请注意,使用此方法,您可以使用任何IEnumerable<T>实现来完成目标,而不仅仅是数组。如果您对仅使用 数组感到满意,则可以使用提供索引的Where()重载,如this answer中那样。

答案 3 :(得分:1)

您可以使用LINQ除此之外。 以下是如何执行此操作的示例:

public static int GetCoincidence(int[] a, int[] b)
{
    return a.Count()-a.Except(b).Count();
}

答案 4 :(得分:0)

var common = (from elemA in a.Select((x, y) => new { Value = x, Index = y })
                     join elemB in b.Select((x, y) => new { Value = x, Index = y })
                     on new { elemA.Index, elemA.Value } equals new { elemB.Index, elemB.Value }
                     select elemA).ToList();