2013-03-14 11 views
5

Wiem, że można użyć Enumerable.SequenceEqual, aby sprawdzić równość. Ale wielowymiarowa tablica nie ma takiej metody. Wszelkie sugestie, jak porównać 2-wymiarową tablicę?Jak porównać tablice wielowymiarowe na temat równości?

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

Wszystkie te właściwości są ustawione w konstruktorze SudokuGrid. Tak więc wszystkie te domy mają prywatne setery. Chcę zachować to w ten sposób.

Teraz robię kilka testów z testami jednostkowymi C#. Chcę porównać 2 Grids ich wartości, a nie ich referencje.

Ponieważ ustawiam wszystko za pomocą prywatnych ustawiaczy za pomocą konstruktora. Ten Równe przesłanianie w klasie SudokuGrid jest poprawna, ale nie to, czego potrzebuję:

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

To nie jest to, co muszę, ponieważ robię testy. Więc jeśli mój rzeczywisty sudoku jest:

SudokuGrid actual = new SudokuGrid(2, 3); 

wtedy moje oczekiwane sudoku nie może być po prostu:

SudokuGrid expected = new SudokuGrid(2, 3); 

ale powinno być:

Field[,] expected = sudoku.Grid; 

więc nie mogę użyć klasy aby porównać jego właściwości siatki, ponieważ nie mogę po prostu ustawić siatki, ponieważ seter jest prywatny. Byłoby głupio, gdybym musiał zmienić mój oryginalny kod, żeby moje testy jednostek mogły zadziałać.

Pytania:

  • Więc jest ich sposób rzeczywiście porównać tablice wielowymiarowe? (Czy mogę przesłonić równą metodę, której używa tablica wielowymiarowa?)
  • Czy jest inny sposób na rozwiązanie mojego problemu?
+0

jego nie do końca jasne, jaki jest twój problem. Ale dlaczego nie usuniesz zagnieżdżenia siatki za pomocą indeksera; tj. 'public Pole to [int x, int y] {get; set;}' in SudokuGrid; SudokuGrid skutecznie ukrywa rzeczywistą tablicę i zapewnia mechanizmy do zmiany tablicy; Teraz możesz przetestować, czy te funkcje działają poprawnie; Dopóki te same operacje na dwóch obiektach nie dają wyniku równego, nie widzę problemu. –

+0

Naprawiłem to, dodając do mojego kodu wzór Factory. Tak więc wypełniam moje sudoku metodą mojej fabryki i udostępniam tam wszystkie moje metody. Nie dokładnie to, czego chcę, ale domyślam się, że nie miałem innego wyboru. – dylanmensaert

+0

[Proszę nie umieszczać metatagów w tytule] (http://meta.stackexchange.com/q/19190/135230) –

Odpowiedz

2

Można użyć następującą metodę rozszerzenia, ale trzeba by zrobić Field wdrożyć 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; 
} 
Powiązane problemy