web-dev-qa-db-fra.com

Comment comparer des tableaux en C #?

Duplicate possible:
Le moyen le plus simple de comparer des tableaux en C #

Comment comparer deux tableaux en C #?

J'utilise le code suivant, mais son résultat est faux. Je m'attendais à ce que ce soit vrai.

Array.Equals(childe1,grandFatherNode);
95
mahdi

Vous pouvez utiliser Enumerable.SequenceEqual () dans System.Linq pour comparer le contenu du tableau.

bool isEqual = Enumerable.SequenceEqual(target1, target2);
208
AMing

Vous comparez les références d'objet et elles ne sont pas identiques. Vous devez comparer le contenu du tableau.

Solution .NET2

Une option parcourt les éléments du tableau et appelle Equals() pour chaque élément. N'oubliez pas que vous devez redéfinir la méthode Equals() pour les éléments du tableau, s'ils ne correspondent pas à la même référence d'objet.

Une alternative consiste à utiliser cette méthode générique 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;
}

Solution .NET 3.5 ou supérieure

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

36
Daniel Peñalba

Il n'y a pas de méthode statique Equals dans la classe Array, de sorte que vous utilisez en réalité Object.Equals, qui détermine si les deux références d'objet pointent sur 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)

Modifier:

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

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

Usage:

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

Si votre tableau a plus de dimensions que deux, vous aurez besoin d'une extension prenant en charge 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.

Bien sûr, vous devez d’abord vérifier que le nombre de dimensions et la taille des tableaux correspondent avant de comparer le contenu des tableaux.

Edit 2:

Il s'avère que vous pouvez utiliser le OfType<T> méthode pour aplatir un tableau, comme l'a souligné RobertS. Naturellement, cela ne fonctionne que si tous les éléments peuvent réellement être convertis dans le même type, mais c'est généralement le cas si vous pouvez quand même les comparer. Exemple:

childe1.OfType<Person>().SequenceEqual(grandFatherNode.OfType<Person>())
18
Guffa

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

Actuellement, lorsque vous comparez deux tableaux avec l'opérateur =, nous utilisons réellement l'opérateur = de System.Object, qui ne compare que les instances. (c’est-à-dire qu’il utilise l’égalité de référence, il ne sera donc vrai que si les deux tableaux pointent exactement sur la même instance)

Source

Si vous souhaitez comparer le contenu des tableaux, vous devez les parcourir en boucle et comparer les éléments.

Le même article de blog a un exemple de la façon de procéder.

7
ChrisF

La méthode Equals effectue une comparaison de références - si les tableaux sont des objets différents, ils renverront en effet false.

Pour vérifier si les tableaux contiennent des valeurs identiques (et dans le même ordre), vous devrez les parcourir et les tester pour vérifier leur égalité.

1
Oded

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

Il ne semble pas y avoir de méthode permettant de comparer les valeurs, mais il serait très facile d’écrire.

Il suffit de comparer les longueurs, sinon égales, renvoyer false. Sinon, parcourez chaque valeur du tableau et déterminez si elles correspondent.

0
Jonathan Wood