2012-06-14 40 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