2010-09-30 59 views
2

我正在構建一個矩陣類(我知道存在一個),我正在考慮初始化。目前初始化之一是如何模仿/繼承數組初始化syntaxin c#?

double[,] data; 
    public Matrix(double[,] data) 
    { 
     if (data.GetLength(0) == 0 || data.GetLength(1) == 0) 
     { 
      throw new ArgumentException(); 
     } 
     this.data = (double[,])(data.Clone()); 
    } 

這是很好的,因爲它可以像

Matrix matrix= new Matrix(new double[,]{{1, 0 , 0 }, 
              {1, 0.5, 0 }}); 

初始化有沒有辦法做到這一點更緊湊,有點像

Matrix matrix= new Matrix{{1,0}, {1,1}, {1,5}}; 

甚至更好

Matrix matrix = {{1,0}, {1,1}, {1,5}}; 

回答

4

嘛,不是最後的 - 但倒數第一位是至少可能使用集合初始化:

  • 實現IEnumerable(可以明確地做,拋出一個異常,如果你真的不想要它被通常稱爲)
  • 創建Add(params double[] values)方法

麻煩的是,這使得你的矩陣可變的。您可以潛在創建MatrixBuilder類,並使用:

Matrix matrix = new MatrixBuilder{{1,0}, {1,1}, {1,5}}.Build(); 

還有其他的問題,當然-you'd需要檢查的是「黑客帝國」並不是突然開始改變尺寸中途,例如

Matrix matrix = new MatrixBuilder{{1,0}, {1,1,2,2,2,2,2,2}, {1,5}}.Build(); 
3

您可以使用隱式轉換操作符像這樣創建代碼:

Matrix matrix = new double[,] {{1,0}, {1,1}, {1,5}}; 

這是相關代碼:

class Matrix { 
    // ... 
    public static implicit operator Matrix(double[,] data) { 
    return new Matrix(data); 
    } 
}