Comment comparer des tableaux en C#? [dupliquer]
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);
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)
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>())
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)
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.
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.
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.