Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何比较C#中的数组?_C#_Arrays_Compare - Fatal编程技术网

如何比较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);