2013-03-14 34 views
5

Tôi biết bạn có thể sử dụng Enumerable.SequenceEqual để kiểm tra tính bình đẳng. Nhưng một mảng đa chiều không có phương pháp như vậy. Bất kỳ đề xuất nào về cách so sánh mảng 2 chiều?Làm thế nào để so sánh các mảng đa chiều trên bình đẳng?

vấn đề thực tế:

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

Tất cả những thuộc tính được thiết lập trong constructor SudokuGrid. Vì vậy, tất cả các thuộc tính đó có riêng các số định sẵn. Tôi muốn giữ nó theo cách đó.

Bây giờ, tôi đang thực hiện một số thử nghiệm với thử nghiệm đơn vị C#. Tôi muốn so sánh 2 Grids về giá trị của chúng thay vì tham chiếu của chúng.

Vì tôi đã thiết lập mọi thứ với người định cư riêng thông qua hàm tạo. Ghi đè bằng nhau trong lớp SudokuGrid là chính xác, nhưng không phải những gì tôi cần:

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

Nó không phải là những gì tôi cần kể từ khi tôi đang thử nghiệm. Vì vậy, nếu sudoku thực tế của tôi là:

SudokuGrid actual = new SudokuGrid(2, 3); 

sau đó sudoku mong đợi của tôi không thể chỉ là:

SudokuGrid expected = new SudokuGrid(2, 3); 

nhưng nên là:

Field[,] expected = sudoku.Grid; 

Vì vậy, tôi không thể sử dụng lớp để so sánh thuộc tính lưới của nó, vì tôi không thể chỉ đặt lưới vì setter là riêng tư. Nó sẽ là ngu ngốc nếu tôi đã phải thay đổi mã ban đầu của tôi chỉ để kiểm tra đơn vị của tôi có thể làm việc.

Câu hỏi:

  • Vì vậy, rất cần thíêt một cách để thực sự so sánh mảng đa chiều? (Vì vậy, tôi có thể ghi đè phương thức bằng một mảng đa chiều sử dụng?)
  • Có cách nào khác để giải quyết vấn đề của tôi không?
+0

của nó không hoàn toàn rõ ràng vấn đề của bạn là gì. Nhưng, tại sao bạn không loại bỏ việc làm tổ của lưới với một người lập chỉ mục; tức là 'trường công khai này [int x, int y] {get; set;}' trong SudokuGrid; Vì vậy, SudokuGrid có hiệu quả che giấu mảng thực tế và cung cấp các cơ chế để thay đổi bảng; Bây giờ bạn có thể kiểm tra các chức năng này hoạt động chính xác; Vì vậy, miễn là các hoạt động tương tự trên hai đối tượng kết quả trong một kết quả bình đẳng, tôi không thấy một vấn đề. –

+0

Vâng, tôi đã sửa nó bằng cách thêm một mẫu Nhà máy vào mã của tôi. Vì vậy, tôi điền vào sudoku của tôi trong phương pháp nhà máy của tôi, và làm cho tất cả các phương pháp của tôi có công khai. Không chính xác những gì tôi muốn, nhưng đoán tôi không có bất kỳ lựa chọn nào khác. – dylanmensaert

+0

[Vui lòng không đặt thẻ meta trong tiêu đề của bạn] (http://meta.stackexchange.com/q/19190/135230) –

Trả lời

2

Bạn có thể sử dụng phương pháp mở rộng sau, nhưng bạn sẽ phải làm Field thực hiện 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; 
} 
Các vấn đề liên quan