我有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()
答案 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();