Comment comparer des tableaux en C#? [dupliquer]

possibilité de dupliquer:

la manière la plus facile de comparer des tableaux dans C#

Comment puis-je comparer deux tableaux en C#?

j'utilise le code suivant, mais son résultat est faux. Je m'attendais à être vrai.

Array.Equals(childe1,grandFatherNode);
83
demandé sur Community 2010-12-12 21:46:33

6 réponses

vous pouvez utiliser L'énumérable.SequenceEqual() dans le système.Linq pour comparer le contenu dans le tableau

bool isEqual = Enumerable.SequenceEqual(target1, target2);
178
répondu AMing 2012-02-10 06:33:07

vous comparez les object references , et ils ne sont pas les mêmes. Vous devez comparer le contenu du tableau.

.Solution nette (2) 151980920"

une option itère à travers les éléments du tableau et appelle Equals() pour chaque élément. Rappelez-vous que vous devez outrepasser la méthode Equals() pour les éléments du tableau, s'ils ne sont pas la même référence d'objet.

une alternative est d'utiliser ce générique méthode pour comparer deux tableaux génériques:

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;
}

.NET 3.5 ou solution supérieure

Ou utiliser SequenceEqual si Linq est disponible pour vous (.NET Framework >= 3.5)

33
répondu Daniel Peñalba 2014-08-21 08:21:11

il n'y a pas de méthode statique Equals dans la classe Array , donc ce que vous utilisez est en fait Object.Equals , qui détermine si les deux références de l'objet pointent vers le même objet.

si vous voulez vérifier si les tableaux contiennent les mêmes éléments dans le même ordre, vous pouvez utiliser la méthode d'extension SequenceEquals :

childe1.SequenceEqual(grandFatherNode)

Edit:

pour utiliser SequenceEquals avec des tableaux multidimensionnels, vous pouvez utiliser une extension pour les énumérer. Voici une extension pour énumérer un tableau bidimensionnel:

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];
}

Utilisation:

childe1.Flatten().SequenceEqual(grandFatherNode.Flatten())

si votre tableau a plus de dimensions que deux, vous aurez besoin d'une extension qui supporte ce nombre de dimensions. Si le nombre de dimensions varie, vous aurez besoin d'un code un peu plus complexe pour boucler un nombre variable de dimensions.

vous voulez bien sûr d'abord vous assurer que le nombre de dimensions et la taille des dimensions des matrices de match, avant de comparer le contenu des tableaux.

Edit 2:

S'avère que vous pouvez utiliser la méthode OfType<T> pour aplatir un tableau, comme RobertS l'a souligné. Naturellement cela ne fonctionne que si tous les articles peuvent effectivement être moulés dans le même type, mais c'est généralement le cas si vous pouvez les comparer de toute façon. Exemple:

childe1.OfType<Person>().SequenceEqual(grandFatherNode.OfType<Person>())
17
répondu Guffa 2015-03-04 12:59:37

Array.Equals compare les références, pas leur contenu:

actuellement, lorsque vous comparez deux tableaux avec l'opérateur=, nous utilisons vraiment le système.Object's = operator, qui ne compare que les instances. (i.e. ceci utilise l'égalité de référence, donc il ne sera vrai que si les deux tableaux pointent vers la même instance exacte)

Source

Si vous voulez comparez le contenu des tableaux dont vous avez besoin pour boucler les tableaux et comparer les éléments.

Le même billet de blog a un exemple de comment faire cela.

6
répondu ChrisF 2010-12-12 18:50:07

la méthode Equals fait une comparaison de référence - si les tableaux sont des objets différents , cela retournera en effet false.

pour vérifier si les tableaux contiennent des valeurs identiques (et dans le même ordre), vous devrez itérer sur eux et tester l'égalité sur chacun.

1
répondu Oded 2010-12-12 18:49:25

tableau.Equals () semble ne tester que pour la même instance.

il ne semble pas y avoir de méthode qui compare les valeurs mais ce serait très facile à écrire.

il suffit de comparer les longueurs, si elles ne sont pas égales, retourner false. Sinon, bouclez chaque valeur dans le tableau et déterminez si elles correspondent.

0
répondu Jonathan Wood 2010-12-12 18:51:14