2015-11-19 53 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的尺寸相同。