我试图返回一个代表两个数组之间相似性的数字。
IE :
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 部分返回 anIEnumerable<bool>
和 count 部分计算true
该列表中出现的次数。