可能重复:
在C#中比较数组的最简单方法
如何在C#中比较两个数组?
我使用以下代码,但结果是错误的.我期待它是真的.
Array.Equals(childe1,grandFatherNode);
Run Code Online (Sandbox Code Playgroud)
AMi*_*ing 212
您可以使用System.Linq中的Enumerable.SequenceEqual()来比较数组中的内容
bool isEqual = Enumerable.SequenceEqual(target1, target2);
Run Code Online (Sandbox Code Playgroud)
Dan*_*lba 36
您正在比较对象引用,它们并不相同.您需要比较数组内容.
一个选项是迭代数组元素并调用Equals()每个元素.请记住Equals(),如果数组元素不是同一个对象引用,则需要覆盖它们的方法.
另一种方法是使用这种通用方法来比较两个通用数组:
static bool ArraysEqual<T>(T[] a1, T[] a2)
{
if (ReferenceEquals(a1, a2))
return true;
if (a1 == null || a2 == null)
return false;
if (a1.Length != a2.Length)
return false;
EqualityComparer<T> comparer = EqualityComparer<T>.Default;
for (int i = 0; i < a1.Length; i++)
{
if (!comparer.Equals(a1[i], a2[i])) return false;
}
return true;
}
Run Code Online (Sandbox Code Playgroud)
如果Linq可用,请使用SequenceEqual(.NET Framework> = 3.5)
Guf*_*ffa 19
类中没有静态Equals方法Array,因此您实际使用的是Object.Equals确定两个对象引用是否指向同一对象.
如果要检查数组是否包含相同顺序的相同项,可以使用SequenceEquals扩展方法:
childe1.SequenceEqual(grandFatherNode)
Run Code Online (Sandbox Code Playgroud)
要SequenceEquals与多维数组一起使用,可以使用扩展来枚举它们.这是枚举二维数组的扩展:
public static IEnumerable<T> Flatten<T>(this T[,] items) {
for (int i = 0; i < items.GetLength(0); i++)
for (int j = 0; j < items.GetLength(1); j++)
yield return items[i, j];
}
Run Code Online (Sandbox Code Playgroud)
用法:
childe1.Flatten().SequenceEqual(grandFatherNode.Flatten())
Run Code Online (Sandbox Code Playgroud)
如果您的数组的维度超过两个,则需要一个支持该维数的扩展.如果维度的数量不同,则需要更复杂的代码来循环可变数量的维度.
在比较数组的内容之前,您当然首先要确保维度的数量和数组的维度大小匹配.
事实证明,你可以使用该OfType<T>方法来展平数组,正如RobertS指出的那样.当然,只有当所有项目实际上都可以转换为相同类型时才有效,但如果你可以比较它们通常就是这种情况.例:
childe1.OfType<Person>().SequenceEqual(grandFatherNode.OfType<Person>())
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
119760 次 |
| 最近记录: |