1

我在两个 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 中的数据,列表框 diff 是来自 diff 的数据。 编辑

我已经进入 System.Linq。

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

嘿嘿

4

4 回答 4

4

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

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

于 2012-06-14T07:06:59.263 回答
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;
}
于 2012-06-14T07:15:49.227 回答
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);
     }
 }
于 2012-06-14T07:14:37.653 回答
0

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

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

于 2012-06-14T07:09:13.073 回答