繁体   English   中英

比较数组并返回相似图C#

[英]Comparing arrays and returning a similarity figure C#

我试图返回一个数字,代表两个数组之间的相似性。
即:

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();

编辑:哦,刚刚看到您希望它们位于相同的位置。

您说的是“根据索引”,假设您的意思是如果“约翰”在第一个列表中的位置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> ,而count部分计算该列表中true发生的次数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM