2012-06-14 43 views
1

我在兩個ArrayList arrayListA和arrayListB中有數據。在C#中檢查兩個ArrayList之間的差異

我想檢查這兩個arrayLists是否有區別。

,所以我做這個代碼:

ArrayList diff = new ArrayList(); 
foreach (string[] a in arrayListB) 
{ 
    if(!arrayListA.Contains(a)) 
    { 
     diff.Add(a); 
    } 
} 

所以在這裏我的問題,當我運行程序。 arrayListB中的所有數據都被添加到ArrayList diff中。它應該只添加僅在arrayListA而不是arrayListB中的數據,是否正確?

出了什麼問題?

這是我運行程序後的結果。 listbox a是arrayListA中的數據,listbox B是arrayListB中的數據,而listbox diff是diff中的數據。 EDIT

我已經輸入System.Linq。

但我沒有得到我的列表的「Where」屬性。

haih

回答

2

首先,它會更容易與清單的工作:

List<string[]> listA = new List<string[]>(); 
List<string[]> listB = new List<string[]>(); 

現在你可以使用LINQ得到A中但不是B中的那些,以及B中但不是A中的那些,併合並它們以獲得完全的差異:

using System.Linq; 

... 

List<string[]> diff = 
    listA.Where(a => !listB.Any(a.SequenceEqual)).Union(
    listB.Where(b => !listA.Any(b.SequenceEqual))).ToList(); 

翻譯上面的代碼中,用簡單的循環和更長的代碼是:

所有的
private List<string[]> GetDiff(List<string[]> listA, list<string[] listB>) 
{ 
    var diff = new List<string[]>(); 

    foreach (var a in listA) 
    { 
     bool found = false; 

     foreach (var b in listB) 
     { 
      if (a.SequenceEqual(b)) 
      { 
       found = true; 
       break; 
      } 
     } 

     if (!found) 
     { 
      diff.Add(a); 
     } 
    } 

    foreach (var b in listB) 
    { 
     bool found = false; 

     foreach (var a in listA) 
     { 
      if (b.SequenceEqual(a)) 
      { 
       found = true; 
       break; 
      } 
     } 

     if (!found) 
     { 
      diff.Add(b); 
     } 
    } 

    return diff; 
} 
+0

「where」屬性。我不明白。我需要輸入任何參考來使用它? –

+0

哪裏是擴展方法。簡單地說 - 它適用於一個集合並根據一定的條件進行過濾(給定每個元素的名稱爲'a',只取得滿足'!listB.Any(a.SequenceEqual)'的那個'。Any也是一個擴展方法(它們非常流行,tehe),它返回至少一個元素是否滿足條件(每個元素正在'a.SequenceEqual'中測試)。 – SimpleVar

+0

@QusyaireEzwan哦,要使用它們,你需要添加引用到'System.Linq' - 添加到回答。還添加了回答使用Linq擴展方法的代碼的翻譯,所以你可以完全理解它們是如何工作的以及它們在做什麼 – SimpleVar

4

由於您使用的字符串數組的數組列表,該Contains方法是行不通的:它採用Equals方法來檢查的平等,但Equals在C#數組實現不支付注意數組元素的相等性。

這是一個討論在C#中檢查數組相等問題的問題link

0

沒有內置的等於string[],使Contains工作的方式,你可能想要的。您需要實現string[]的自定義比較,並使用以比較器作爲參數的Contains的其他覆蓋。

另外,如果使用強類型列表,比如List<string[]>,那麼最好使用強類型列表。

1

假設都arrayListB,包含字符串數組,那麼你可以嘗試爲

ArrayList diff = new ArrayList(); 
foreach (var b in arrayListB) 
{ 
    bool found = false; 
    foreach (var a in arrayListA) 
    { 
     if(Enumerable.SequenceEqual(a as string[], b as string[])) 
     { 
      found = true 
      break; 
     } 
    } 
    if(!found) 
    { 
     diff.Add(b); 
    } 
} 
+0

首先,它應該是'SequenceEqual',你可以把它當作是更好看的擴展方法!其次,你不會得到列表之間的區別,你只會得到B中的元素,但不是A中的元素。 – SimpleVar