2016-03-07 74 views
0

我正在尋找使用數組索引0作爲主鍵的兩個字符串數組列表之間的區別。查找2個字符串數組列表中的差異

List<string[]> original = new List<string[]>(); 
List<string[]> web = new List<string[]>(); 

//define arrays for List 'original' 
string[] original_a1 = new string[3]{"a","2","3"}; 
string[] original_a2 = new string[3]{"x","2","3"}; 
string[] original_a3 = new string[3]{"c","2","3"}; 

//define arrays for List 'web' 
string[] web_a1 = new string[3]{"a","2","3"}; 
string[] web_a2 = new string[3]{"b","2","3"}; 
string[] web_a3 = new string[3]{"c","2","3"}; 

//populate Lists 
original.Add(original_a1); 
original.Add(original_a2); 
original.Add(original_a3); 

web.Add(web_a1); 
web.Add(web_a2); 
web.Add(web_a3); 

我的目標是要找到什麼是在名單「原始」而不是在「網絡」使用索引0作爲主鍵
這是我試過了。

List<string> differences = new List<string>(); //differences go in here 
string tempDiff = ""; // I use this to try and avoid duplicate entries but its not working 

for(int i = 0; i < original.Count; i++){ 
for(int j = 0; j< web.Count; j++){ 
    if(!(original[i][0].Equals(web[j][0]))){ 
     tempDiff = original[i][0]; 
    } 
} 
differences.Add(tempDiff); 
} 

OUTPUT:

foreach(string x in differences){ 
    Console.WriteLine("SIZE " + differences.Count); 
    Console.WriteLine(x); 
    ConSole.ReadLine(); 
} 

SIZE 3 

SIZE 3 
x 

SIZE 3 

x 

爲什麼報告不匹配的3倍,而不是一次?

回答

4

使用LINQ,你可以去:

var differences = orignal.Except(web).ToList(); 

參考here

這會給你是在original沒有在web

對不起沒有存在的價值,正確閱讀你的問題,回答你的問題: 你有一個嵌套for循環。因此,對於原始(3)的每個值,它將遍歷所有web(3)的值,總共爲9個循環。

3種情況不匹配,因此輸出3次。

0

我認爲這是你想要的。我使用Linq抓取主鍵,然後使用Except來做original - web。順便說一句,您可以使用==而不是Equals與C#中的字符串,因爲C#執行值比較而不是參考比較。

List<string[]> original = new List<string[]> 
{ 
    new string[3] { "a", "2", "3" }, 
    new string[3] { "x", "2", "3" }, 
    new string[3] { "c", "2", "3" } 
}; 
List<string[]> web = new List<string[]> 
{ 
    new string[3] { "a", "2", "3" }, 
    new string[3] { "b", "2", "3" }, 
    new string[3] { "c", "2", "3" } 
}; 

var originalPrimaryKeys = original.Select(o => o[0]); 
var webPrimaryKeys = web.Select(o => o[0]); 

List<string> differences = originalPrimaryKeys.Except(webPrimaryKeys).ToList(); 

Console.WriteLine("The number of differences is {0}", differences.Count); 
foreach (string diff in differences) 
{ 
    Console.WriteLine(diff); 
} 

這裏,它是沒有的Linq:

var differences = new List<string>(); 

for (int i = 0; i < original.Count; i++) 
{ 
    bool found = false; 
    for (int j = 0; j < web.Count; j++) 
    { 
     if (original[i][0] == web[j][0]) 
     { 
      found = true; 
     } 
    } 

    if (!found) 
    { 
     differences.Add(original[i][0]); 
    } 
} 
0

要回答你的問題:它是一個嵌套的for循環中JanR的回答說。這種方法將使您重複您的網站數量9次,從而將您的不匹配密鑰列出三次。

這可能是一個更好的辦法做到的是:

//Check for originals not introduced in web. 
     if(original.Count > web.Count) 
     { 

      for(int y = web.Count; y < original.Count; y++) 

      { 
       differences.Add(original[y][0]); 
      } 
     } 
//Check if Web has value, if not, everything else is done on the first for loop 
     if(web.Count > 0) 
     { 
      for(int i = 0; i < original.Count; i++) 
       { 
        if(!original[i][0].Equals(web[i][0])) 
         differences.Add(original[i][0]); 
       } 
     } 

而且,輸出是一個for循環,當你只需要一個結果,不匹配的長度。你可以做到這一點沒有循環。

  Console.WriteLine("SIZE " + differences.Count); 

這當然是讓它有點簡單,如果你不習慣使用LINQ語句,但是如果你可以用LINQ這樣做,然後通過各種手段,使用LINQ因爲它的效率更高。

0

您可以通過使用Except擴展方法是這樣獲得的區別:

var originalDic = original.ToDictionary(arr => arr.First()); 
var webDic = web.ToDictionary(arr => arr.First()); 
var differences = 
    originalDic 
    .Except(webDic, kvp => kvp.Key) 
    .Select(kvp => kvp.Value) 
    .ToList(); 

這裏的竅門是,首先使用每個數組作爲鍵,然後第一個元素轉換你的原始和網絡列表成爲一個Dictionary執行Except