2013-03-14 6 views
5

Ich weiß, dass Sie Enumerable.SequenceEqual verwenden können, um die Gleichheit zu überprüfen. Aber ein mehrdimensionales Array hat keine solche Methode. Irgendwelche Vorschläge zum Vergleich von zweidimensionalen Arrays?Wie multidimensionale Arrays auf Gleichheit zu vergleichen?

tatsächliches Problem:

public class SudokuGrid 
{ 
    public Field[,] Grid 
    { 
     get { return grid; } 
     private set { grid = value; } 
    } 
} 

public class Field 
{ 
    private byte digit; 
    private bool isReadOnly; 
    private Coordinate coordinate; 
    private Field previousField; 
    private Field nextField; 
} 

All diese Eigenschaften sind in dem SudokuGrid Konstruktor festgelegt. Also alle diese Eigenschaften haben private Setter. Ich möchte es so halten.

Jetzt mache ich ein paar Tests mit C# Unit Tests. Ich möchte 2 Grids auf ihren Werten eher als ihre Referenzen vergleichen.

Da habe ich alles mit privaten Setter über Konstruktor gesetzt. Diese Gleichüberschreibung in der Klasse SudokuGrid ist richtig, aber nicht das, was ich brauche:

public bool Equals(SudokuGrid other) 
{ 
    if ((object)other == null) return false; 

    bool isEqual = true; 

    for (byte x = 0; x < this.Grid.GetLength(0); x++) // 0 represents the 1st dimensional array 
    { 
     for (byte y = 0; y < this.Grid.GetLength(1); y++) // 1 represents the 2nd dimensional array 
     { 
      if (!this.Grid[x, y].Equals(other.Grid[x, y])) 
      { 
       isEqual = false; 
      } 
     } 
    } 

    return isEqual; 
} 

Es ist nicht das, was ich brauche, da ich Tests mache. Also, wenn meine eigentliche Sudoku ist:

SudokuGrid actual = new SudokuGrid(2, 3); 

dann kann mein erwartetes Sudoku nicht nur sein:

SudokuGrid expected = new SudokuGrid(2, 3); 

soll aber sein:

Field[,] expected = sudoku.Grid; 

So kann ich nicht die Klasse verwenden um seine Grid-Eigenschaft zu vergleichen, da ich das Grid nicht einfach setzen kann, da Setter privat ist. Es wäre dumm, wenn ich meinen ursprünglichen Code ändern müsste, nur damit meine Unit-Tests funktionieren könnten.

Fragen:

  • ist sie also eine Art und Weise zu vergleichen, tatsächlich mehrdimensionale Arrays zu? (Kann ich vielleicht die gleiche Methode überschreiben, die ein multidimensionales Array verwendet?)
  • Gibt es vielleicht einen anderen Weg, um mein Problem zu lösen?
+0

Es ist nicht ganz klar, was das Problem ist. Aber warum entfernen Sie nicht die Verschachtelung des Gitters mit einem Indexer; d. h. 'public Field this [intx, inty] {get; set;}' in SudokuGrid; So versteckt SudokuGrid effektiv das tatsächliche Array und bietet Mechanismen zum Ändern der Platine; Jetzt können Sie testen, ob diese Funktionen korrekt funktionieren. Solange die gleichen Operationen für zwei Objekte zu einem Equal-Ergebnis führen, sehe ich kein Problem. –

+0

Nun, ich habe es behoben, indem ich meinem Code ein Factory-Muster hinzugefügt habe. Also fülle ich mein Sudoku mit meiner Fabrikmethode und mache alle meine Methoden dort öffentlich. Nicht genau, was ich will, aber ich denke, ich hatte keine andere Wahl. – dylanmensaert

+0

[Bitte setzen Sie keine Meta-Tags in Ihren Titel] (http://meta.stackexchange.com/q/19190/135230) –

Antwort

2

Sie könnten die folgende Erweiterungsmethode verwenden, aber Sie müssten Field implementieren machen IComparable

public static bool ContentEquals<T>(this T[,] arr, T[,] other) where T : IComparable 
{ 
    if (arr.GetLength(0) != other.GetLength(0) || 
     arr.GetLength(1) != other.GetLength(1)) 
     return false; 
    for (int i = 0; i < arr.GetLength(0); i++) 
     for (int j = 0; j < arr.GetLength(1); j++) 
      if (arr[i, j].CompareTo(other[i, j]) != 0) 
       return false; 
    return true; 
}