2013-03-14 16 views
5

Enumerable.SequenceEqualを使用して同等性を確認できます。しかし、多次元配列にはそのようなメソッドはありません。 2次元配列を比較する方法に関する提案はありますか?多次元配列を等価で比較する方法は?

実際の問題:

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

すべてのこれらのプロパティはSudokuGridコンストラクタで設定されています。だからこれらのプロパティはプライベートセッターを持っています。私はそれをそのままにしたい。

ここでは、C#ユニットテストでいくつかのテストを行っています。私は2 Gridsをそれらの参照ではなくその値に比較したいと思います。

私はコンストラクタを通してプライベートセッタですべてを設定しています。クラスSudokuGridこの均等オーバーライドは正しいですが、私は必要はありません何:

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

それは私がテストをやっているので、私は必要なものではありません。私の実際の数独があるのであれば:

SudokuGrid expected = new SudokuGrid(2, 3); 

が、次のようになります:

SudokuGrid actual = new SudokuGrid(2, 3); 

その後、私の予想数独はちょうどすることはできません

Field[,] expected = sudoku.Grid; 

だから私は、クラスを使用することはできません私はsetterがプライベートなのでグリッドを設定することはできませんので、グリッドプロパティを比較してください。 私のユニットテストがうまくいくようにオリジナルのコードを変更しなければならないのはばかげているでしょう。

質問:

  • だから、実際には多次元配列を比較するために彼らの方法は何ですか? (多次元配列で使用する等価メソッドをオーバーライドできますか?)
  • 私の問題を解決するには別の方法がありますか?
+0

その実装を行う必要があります。しかし、なぜインデクサを使ってグリッドのネストを取り除かないのですか?つまり、SudokuGridの 'publicフィールドthis [int x、int y] {get; set;}'したがって、SudokuGridは効果的に実際の配列を隠し、ボードを変更するメカニズムを提供します。これで、これらの関数を正しくテストできます。 2つのオブジェクトの同じ操作で同じ結果が得られる限り、問題は発生しません。 –

+0

まあ、私は自分のコードにFactoryパターンを追加して修正しました。だから私は工場の方法で私のスドクを満たし、そこにすべての私の方法を公開する。正確には私が欲しいものではありませんが、他の選択肢はありませんでした。 – dylanmensaert

+0

[タイトルにメタタグを入れないでください](http://meta.stackexchange.com/q/19190/135230) –

答えて

2

次の拡張メソッドを使用することができますが、Fieldがあなたの問題が何であるかを完全には明らかではない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; 
} 
関連する問題