我在两个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的数据。
我已经输入了System.Linq。
但我没有为我的列表获得“Where”属性。
答案 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[]>
开头。