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#ユニットテストでいくつかのテストを行っています。Grids参照ではなく、値で2を比較したいと思います。

コンストラクターを介してプライベートセッターですべてを設定したので。クラスでのこのEqualオーバーライド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 actual = new SudokuGrid(2, 3);

それなら私の期待する数独はただのことではありません:

SudokuGrid expected = new SudokuGrid(2, 3);

しかし、次のようにする必要があります。

Field[,] expected = sudoku.Grid;

したがって、setterはプライベートであるため、グリッドを設定することはできないため、クラスを使用してそのグリッドプロパティを比較することはできません。単体テストが機能するように元のコードを変更しなければならないのはばかげているでしょう。

質問:

  • では、実際に多次元配列を比較する方法はありますか?(多次元配列が使用するequalメソッドをオーバーライドできますか?)
  • 私の問題を解決する別の方法はありますか?
4

1 に答える 1

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;
}
于 2013-03-14T16:30:20.547 に答える