【问题标题】:Comparing arrays and returning a similarity figure C#比较数组并返回相似度图 C#
【发布时间】:2012-10-11 05:04:17
【问题描述】:

我正在尝试返回一个表示两个数组之间相似性的数字。
即:

Array1: {Katy, Jenny, Sarah, Ben, Jill, Tina} 
Array2: {Katy, John, Sam, Ben, Jill, Linda}

我想返回数字 3,因为三个比较是正确的。这是 可能的?我想不出任何可以为我做这件事的函数。

【问题讨论】:

  • 按索引还是一般通用?
  • 用这个Link,和你问的一样

标签: c# arrays compare


【解决方案1】:

这是计算匹配索引中相等的项目数量的方法。

var c = arr1.Where((x, i) => x.Equals(arr2[i])).Count();

请注意,您可能需要确保不要尝试访问超出范围的索引中的 arr2:

var c = arr1.Take(arr2.Length).Count(...);

如果你不关心索引位置,你应该使用 nemesv 的解决方案。

【讨论】:

  • 你有编译样本吗?我不知道 Count method 接受带有两个参数的 Func...
  • 根据 OP 的评论“如果它位于数组 1 中的 {3} 位置,则它必须位于数组 2 中的 {3} 位置”,您使用 Where((x, i)... 的解决方案是正确的。
  • @nemesv 看起来像。顺便说一句,我认为您可以提出比相交更好的解决方案,方法是对它们进行排序并设置两个并排递增的索引(假设问题是您回答的问题)。
【解决方案2】:

有很多方法可以做到这一点。由于其他人已经指定了几种方法,我将尝试发布一种不同的方法。

如果您考虑基于索引进行匹配,您可以使用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()

【讨论】:

  • 这行不通。 LINQ 方法是惰性求值的,因此如果从不枚举集合,则计数器将永远不会递增。
【解决方案3】:

我解决这个问题的方法也是取第一个数组中的值并将其与第二个数组中的所有其他值进行比较。如果它们匹配,则增加一个比较计数器,这将告诉您它们是匹配的三个比较。

【讨论】:

  • 名称必须在完全相同的位置。即,如果它位于数组 1 中的 {3} 位置,则它必须位于数组 2 中的 {3} 位置。
【解决方案4】:

这对我有用:

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

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

【讨论】:

    【解决方案5】:

    您说的是“根据索引”,假设您的意思是如果“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++;
    }
    

    【讨论】:

      【解决方案6】:

      我会这样做:

      int count = array1.Zip(array2, (a, b) => a.Equals(b)).Count(b => b);
      

      zip 部分返回IEnumerable&lt;bool&gt;,计数部分计算true 在该列表中出现的次数。

      【讨论】:

        猜你喜欢
        • 2019-06-17
        • 1970-01-01
        • 2011-08-09
        • 1970-01-01
        • 2011-10-20
        • 1970-01-01
        • 1970-01-01
        • 2019-08-08
        • 2013-08-07
        相关资源
        最近更新 更多