2010-12-03 20 views
2

En C++, si vous voulez vérifier si 2 tableaux sont égaux (en termes de contenu), vous pouvez faire:Comment comparer les tableaux pour l'égalité en C#?

#include <vector> 
#include <cassert> 

using namespace std; 

int main (int argc, char * const argv[]) { 

    vector<int> a; 
    a.push_back(5); 
    a.push_back(6); 
    a.push_back(7); 

    vector<int> b = a; // this copies array a's contents to array b 

    assert(a == b);  // this compares the content of array a and b one element at a time 

    return 0; 
} 

Comment puis-je obtenir la même chose en C# sans écrire ma propre comparaison pour boucle ?

3 liens que je trouve à ce jour, bien que je ne suis pas sûr si elles sont obsolètes:

  • Jon Skeet's answer (rouler votre propre boucle)
  • Using LINQ (utilisation SequenceEqual() ou Intersection() - mais est-ce pris en charge dans Mono?)
  • MSDN blogs -- Array.Equals - Je suis vraiment surpris que la comparaison de contenu de tableau ne soit pas fournie hors de la boîte. = S

Je suis un débutant C# et j'utilise Mono.

+2

Avez-vous essayé LINQ/SequenceEqual/Intersection en Mono? Si cela fonctionne, c'est le gagnant facile. –

+0

@pst Vous devriez publier une réponse et gagner des upvotes. :) –

+0

@pst: J'ai essayé dans MonoDevelop, mais l'Intellisense n'a pas fait de popup, donc il ne doit pas être supporté. – sivabudh

Répondre

1

Je ne suis pas sûr de Moño qui est pourquoi j'ai supprimé ma réponse précédente

vous pouvez le faire en bouclant/mise en œuvre Stack becoz push/Pop est O (1) le fonctionnement et l'accès à un élément dans le tableau est également O (1) opération.

If (Arr1.Length != Arr2.Length) 
{ 
    return false // not equals 
} 
else 
    { 
    Arr1.Sort(); // important as both array has to be sorted 
    Arr2.Sort() ;// important as both array has to be sorted 

     for(int i=0;i<Arr1.Length ; i++) 
     { 
      if(Arr[i]!=Arr1[i]) 
       break; 
     } 

    } 
+0

Cela suppose que les tableaux ne sont pas ordonnés. –

+0

@Brian: j'ai trié le tableau dans d'autres comme première étape, ya je ne sais pas si Mono a la méthode de tri ou pas – TalentTuner

+0

C'est mon point. Dans votre implémentation {1, 2} et {2, 1} sont égaux, mais ce n'est peut-être pas le comportement prévu. C'est tout. –

1

Heres une méthode d'extension efficace qui devrait faire l'affaire

public static bool Compare<T>(this T[] source, T[] target, 
     Func<T,T,bool> comparer) 
{ 
    if (source.Length != target.Length) 
     return false; 
    return !source.Where((t, i) => !comparer(t, target[i])).Any(); 
} 

var a = new[] {2, 3, 4, 5, 6, 7, 8}; 
var b = new[] {2, 3, 4, 5, 6, 7, 8}; 
var c = new[] {2, 3, 4, 5, 6, 7, 8, 9}; 
var d = new[] {2, 4, 3, 5, 6, 8, 7}; 

var r1 = a.Compare(b, (i1, i2) => i1 == i2); // true 
var r2 = a.Compare(c, (i1, i2) => i1 == i2); // false 
var r3 = a.Compare(d, (i1, i2) => i1 == i2); // false 
+1

Si LINQ est supporté, vous pouvez simplement utiliser 'SequenceEqual'. –

+0

@Danny - si les deux sources sont des tableaux et de longueur inégale, alors mon implémentation sera plus rapide car SequenceEquals effectue uniquement une comparaison via une interface IEnumerable de collections. En outre, mon implémentation permet à l'utilisateur de fournir une fonction qui effectue la comparaison, tandis que SequenceEquals essaie de trouver la valeur de EqualityComparer .Default - et si elle n'existe pas dans son cache, elle en crée une en utilisant la réflexion, ce qui peut être un problème de performances. –

+0

Je veux dire la partie '.Where(). Tout dans votre code peut être simplement' SequenceEqual', dans lequel vous pouvez également fournir un 'Comparer' personnalisé. –

3
bool equals = array1.OrderBy(a => a).SequenceEqual(array2.OrderBy(a => a)); 

moyen facile