2015-11-19 54 views
4

我有两个数组(两者长度相同),我试图遍历两个数组中的每个元素,并测试这些元素(它们的是否相同索引)是否相等。我想得到相同的数字和不相等的数字。我已经能够使用while循环做到这一点,但我想知道System.Linq扩展是否有更快的方法?获取相同索引处相同元素的数量

这就是我现在所拥有的:

var list1 = new List<Color> 
     { 
      Color.Aqua, 
      Color.AliceBlue, 
      Color.Beige, 
      Color.Red, 
      Color.Green, 
      Color.White 
     }; 


     var list2 = new List<Color> 
     { 
      Color.Red, 
      Color.BurlyWood, 
      Color.Beige, 
      Color.Azure, 
      Color.Green, 
      Color.Magenta 
     }; 

     var enumFirst = list1.GetEnumerator(); 
     var enumSecond = list2.GetEnumerator(); 

     var equal = 0; 
     var notEqual = 0; 

     while (enumFirst.MoveNext() && enumSecond.MoveNext()) 
     { 
      var colorFirst = enumFirst.Current; 
      var colorSecond = enumSecond.Current; 

      if (colorFirst == colorSecond) 
       equal++; 
      else 
       notEqual++; 
     } 

     Console.WriteLine("Elements that are equal: " + equal); 
     Console.WriteLine("Elements that are not equal: " + notEqual); 

输出是:

Elements that are equal: 2 
Elements that are not equal: 4 

回答

7

是,使用Zip

var equal = list1.Zip(list2, (l1, l2) => l1 == l2).Count(x => x); 
var notEqual = list1.Count() - equal; 

Zip将跳过所有剩余的元素,如果列表中的一个具有没有更多的元素来枚举(列表有不同数量的元素):

如果输入序列不具有相同数量的元素,该方法将元素合并到其中一个序列的末尾。

2

也许不是快,但绝对的一行:

var areequal = list1.Select((x, i) => list2[i] == x); 
var equals = areequal.Count(x => x); 
var notequals = areequal.Count(x => !x); 

使用Select您可以选择是否elemest是否相等,然后使用计数,计数每个组。如果列表2至少大小列表1相同的这种方法才有效(但问题是需要注意的是列表是相同的大小)

但如果在某些情况下,这些名单是不同大小的改变第一行:

var areequal = list1.Take(Math.Min(list2.Count, list.Count)) 
                 .Select((x, i) => list2[i] == x); 

Take将使您确定list1中的所有加工元素的尺寸与list2的尺寸相同。