我试图返回一个表示两个数组之间相似性的数字。
即:
Array1: {Katy, Jenny, Sarah, Ben, Jill, Tina}
Array2: {Katy, John, Sam, Ben, Jill, Linda}
我想返回数字 3,因为三个比较是正确的。这是可能?我想不出任何可以为我做到这一点的功能。
这是计算匹配索引中相等的项目数量的方法。
var c = arr1.Where((x, i) => x.Equals(arr2[i])).Count();
请注意,您可能希望确保不会尝试访问超出范围的索引中的 arr2:
var c = arr1.Take(arr2.Length).Count(...);
如果你不关心指数位置,你应该使用 nemesv 的解决方案。
有很多方法可以做到这一点。由于其他人已经指定了几种方法,我将尝试发布一种不同的方法来做同样的事情。
如果您考虑基于索引进行匹配,则可以使用 Zip 执行类似操作
var cnt = 0;
Array1.Zip(Array2,(a,b)=>{
if(a.Equals(b)) ++cnt;
return string.Empty; //we dont need this
}).Count(); // use tolist or count to force evaluation
如果你不关心排序,只关心匹配,你可以使用 Intersect
Array1.Intersect(Array2).Count()
我解决这个问题的方法是将第一个数组中的值与第二个数组中的其他值进行比较。如果它们匹配,则增加一个比较计数器,这将告诉您有三个匹配的比较。
我有用:
var array1 = new string[] {"Katy", "Jenny", "Sarah", "Ben", "Jill", "Tina"};
var array2 = new string[] {"Katy", "John", "Sam", "Ben", "Jill", "Linda"};
var similarity = (array1.Length + array2.Length) - array1.Union(array2).Count();
编辑:哦,刚刚看到您希望它们处于相同的位置。
你说的是"根据索引",假设你的意思是,如果"John"在第一个列表中的位置 1,而在第二个列表的位置 2 上 => 不匹配。
在这种情况下:
int maxItems = Math.Min(arr1.Length, arr2.Length);
int matchCount = 0;
for(int i = 0; i < maxItems; i++)
{
if(object.Equals(arr1[i], arr2[i]))
matchCount++;
}
我会这样做:
int count = array1.Zip(array2, (a, b) => a.Equals(b)).Count(b => b);
zip 部分返回一个IEnumerable<bool>
,计数部分计算true
在该列表中出现的次数。