检查C#中两个ArrayList之间的不同

时间:2012-06-14 07:01:50

标签: c# arraylist

我在两个ArrayList arrayListA和arrayListB中有数据。

我想检查这两个数组列表之间是否存在差异。

所以我在代码中执行此操作:

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

所以当我运行程序时,我的问题就在这里。 arrayListB中的所有数据都被添加到ArrayList diff中。它应该只添加仅在arrayListA而不是arrayListB中的数据,对吗?

出了什么问题?

这是我运行程序后的结果。列表框a是arrayListA中的数据,列表框B是arrayListB中的数据,listbox diff是来自diff的数据。 EDIT

我已经输入了System.Linq。

但我没有为我的列表获得“Where”属性。

haih

4 个答案:

答案 0 :(得分:4)

由于您使用的是字符串数组的数组列表,Contains方法不起作用:它使用Equals方法检查是否相等,但是Equals的实现在C#数组中没有注意数组元素的相等性。

这是讨论在C#中检查数组相等性问题的link

答案 1 :(得分:2)

首先,使用List会更容易:

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;
}

答案 2 :(得分: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);
     }
 }

答案 3 :(得分:0)

string[]没有内置的Equal使Contains以您可能想要的方式工作。您需要为string[]实现自定义比较,并使用另一个以比较器作为参数的Contains覆盖。

作为旁注,最好使用强类型列表,以List<string[]>开头。