2013-03-14 13 views
5

So che è possibile utilizzare Enumerable.SequenceEqual per verificare l'uguaglianza. Ma una matrice multidimensionale non ha un tale metodo. Qualche suggerimento su come confrontare un array bidimensionale?Come confrontare gli array multidimensionali sull'uguaglianza?

problema reale:

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

Tutte queste proprietà vengono impostate nel costruttore SudokuGrid. Quindi tutte quelle proprietà hanno private setter. Voglio continuare così.

Ora, sto facendo alcuni test con i test dell'unità C#. Voglio confrontare 2 Grids sui loro valori piuttosto che i loro riferimenti.

Poiché ho impostato tutto con i setter privati ​​tramite il costruttore. Questa sostituzione Pari in classe SudokuGrid è corretto, ma non quello che mi serve:

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

Non è quello che mi serve dal momento che sto facendo il test. Quindi, se il mio sudoku reale è:

SudokuGrid actual = new SudokuGrid(2, 3); 

poi i miei sudoku che ci si attende non può essere solo:

SudokuGrid expected = new SudokuGrid(2, 3); 

ma dovrebbe essere:

Field[,] expected = sudoku.Grid; 

quindi non posso utilizzare la classe per confrontare la proprietà della griglia, dal momento che non posso semplicemente impostare la griglia poiché setter è privato. Sarebbe stupido se dovessi cambiare il mio codice originale solo così il mio test unitario potrebbe funzionare.

Domande:

  • Quindi è il loro un modo per confrontare realtà array multidimensionali? (Quindi posso forse sovrascrivere il metodo uguale utilizzato da un array multidimensionale?)
  • C'è forse un altro modo per risolvere il mio problema?
+0

La sua non è del tutto chiaro che cosa il vostro problema. Ma, perché non rimuovere il nesting della griglia con un indicizzatore; cioe' public Field questo [int x, int y] {get; set;} 'in SudokuGrid; Quindi SudokuGrid nasconde effettivamente l'array attuale e fornisce meccanismi per alterare la scheda; Ora puoi verificare che queste funzioni funzionino correttamente; Fintanto che le stesse operazioni su due oggetti producono un risultato uguale, non vedo alcun problema. –

+0

Beh, l'ho risolto aggiungendo un pattern Factory al mio codice. Quindi riempio il mio sudoku nel mio metodo di fabbrica e renderò pubblici tutti i miei metodi. Non esattamente quello che voglio, ma suppongo che non ho scelto nessun altro. – dylanmensaert

+0

[Si prega di non inserire i meta-tag nel titolo] (http://meta.stackexchange.com/q/19190/135230) –

risposta

2

è possibile utilizzare il seguente metodo di estensione, ma si dovrebbe fare Field attuare 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; 
} 
Problemi correlati