如何比较C#中的数组?
可能重复:如何比较C#中的数组?,c#,arrays,compare,C#,Arrays,Compare,可能重复: 如何比较C#中的两个数组 我使用下面的代码,但其结果为false。我希望这是真的 Array.Equals(childe1,grandFatherNode); 您正在比较对象引用,它们不一样。您需要比较数组内容 .NET2解决方案 一个选项是迭代数组元素,并为每个元素调用Equals()。请记住,如果数组元素不是相同的对象引用,则需要重写数组元素的Equals()方法 另一种方法是使用此通用方法比较两个通用数组: static bool ArraysEqual<T>(
如何比较C#中的两个数组 我使用下面的代码,但其结果为false。我希望这是真的
Array.Equals(childe1,grandFatherNode);
您正在比较对象引用,它们不一样。您需要比较数组内容 .NET2解决方案 一个选项是迭代数组元素,并为每个元素调用
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;
var comparer = EqualityComparer<T>.Default;
for (int i = 0; i < a1.Length; i++)
{
if (!comparer.Equals(a1[i], a2[i])) return false;
}
return true;
}
static bool ArraysEqual(T[]a1,T[]a2)
{
if(参考值等于(a1,a2))
返回true;
如果(a1==null | | a2==null)
返回false;
如果(a1.长度!=a2.长度)
返回false;
var comparer=EqualityComparer.Default;
对于(int i=0;i
.NET 3.5或更高版本的解决方案
或者,如果您可以使用Linq(.NET Framework>=3.5)则使用
Equals
方法进行引用比较-如果数组是不同的对象,这将返回false
要检查数组是否包含相同的值(并且顺序相同),需要对它们进行迭代并测试每个数组的相等性
Array.Equals
正在比较引用,而不是它们的内容:
当前,当您使用=运算符比较两个数组时,我们实际上使用的是System.Object的=运算符,它只比较实例。(即,这使用引用相等,因此只有当两个数组都指向完全相同的实例时才为真)
如果要比较数组的内容,需要循环遍历数组并比较元素
同一篇博文中有一个例子说明了如何做到这一点。Array.Equals()似乎只测试同一实例
似乎没有一种方法可以比较这些值,但编写起来非常简单
只需比较长度,如果不相等,则返回false。否则,循环遍历数组中的每个值并确定它们是否匹配。在
数组
类中没有静态的Equals
方法,因此您实际使用的是Object.Equals
,它确定两个对象引用是否指向同一个对象
如果要检查数组是否包含相同顺序的相同项,可以使用SequenceEquals
扩展方法:
childe1.SequenceEqual(grandFatherNode)
编辑:
要对多维数组使用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];
}
如果数组的维度多于两个,则需要支持该数量的维度的扩展。如果维度数量不同,则需要更复杂的代码来循环可变数量的维度
当然,在比较数组的内容之前,首先要确保数组的维度数量和维度大小匹配
编辑2:
正如RobertS指出的那样,可以使用type的方法展平数组。当然,只有当所有项目实际上都可以转换为同一类型时,这才有效,但如果您可以对它们进行比较,通常情况下就是这样。例如:
childe1.OfType<Person>().SequenceEqual(grandFatherNode.OfType<Person>())
childe1.OfType().SequenceEqual(grandFatherNode.OfType())
您可以使用System.Linq中的Enumerable.SequenceEqual()来比较数组中的内容
bool isEqual = Enumerable.SequenceEqual(target1, target2);
你能给我们举个例子吗?为什么这里从来没有标记过答案?我的数组是多维的,SequenceEqual不适用于此type@madhi:您可以扩展此方法以接收T[][],而不是T[]。你是否考虑过把这个问题标记为已回答?谢谢我的数组是多维的,此方法不适用于它@mahdi:您可以使用一个简单的扩展来使多维数组可枚举。我在上面添加了一个示例。@trispid:flant
方法不会创建任何新数组,它只是作为一维可枚举项访问数组的一种方法。@Mark:No,它没有错。我在回答中明确写道:“当然,在比较数组内容之前,首先要确保数组的维度数量和维度大小匹配。”您可以使用of type
展平多维数组。不需要创建新的扩展方法。答案很好,我知道有点晚了,但可以简化为:bool isEqual=target1.SequenceEqual(target2);AMing解决方案处理空情况(并且更“对称”)。@Orace:实际上,Enumerable.SequenceEqual在任一参数为空时会给出异常。Enumerable.SequenceEqual(x,y)
和x.SequenceEqual(y)
的行为相同:如果第一个或第二个集合为空,它们会抛出ArgumentNullException
。请看。快速解释:x.SequenceEqual
是一个扩展方法,因此它与调用Enumerable.SequenceEqual
完全相同。因此,无论您以何种方式编写调用,有关空输入的行为都是相同的
bool isEqual = Enumerable.SequenceEqual(target1, target2);