簡體   English   中英

用於自定義矩陣類的 C# 集合初始化語法?

[英]C# Collection initialization syntax for use with custom matrix class?

我正在創建一個自定義矩陣類,它只有一個 2D 數組來保存所有內容(我知道一維數組更快更好,但這不是這個實現的重點)問題是,我想要一個構造函數,並且能夠做類似的事情

Matrix a = new Matrix(2,2){{1,2},{3,4}};

並讓一切順利。 我遇到了“'Matrix'不包含'Add'的定義並且沒有擴展方法'Add'等”。 但環顧四周后,我還沒有找到足夠可靠的信息,說明如何定義 Add() 方法以使其工作。 這是我到目前為止的代碼

public class Matrix : IEnumerable
    {
        /* What we know abuot matricies
         * - matricies are defined by rows, cols
         * - addition is element-wise
         */

        public IEnumerator GetEnumerator()
        {
            yield return m;
        }

        private void Add(double a)
        {
            // what exactly should go here anyway?
        }

        private double[,] m;

        public double this[int rows, int cols]
        {
            get => m[rows, cols];
            set => m[rows, cols] = value;
        }       

        public Matrix(int rows, int cols)
        {
            m = new double[rows, cols];
        }
    ...
    }

那么,無論如何我將如何執行 Add() 方法?

試試這個代碼。 您的 Add 方法必須是公共的。 此外,為了使代碼安全,您必須添加驗證器來檢查m矩陣的大小和提供的數據是否匹配。

private int currentRow = 0;
public void Add(params double[] a)
{
    for (int c = 0; c < a.Length; c++)
    {
        m[currentRow, c] = a[c];
    }
    currentRow++;
}

如果您不提供所有行,則其余行將包含具有默認值的元素。 另請注意,此方法可以在將來調用,並且當 m 矩陣已填充所有行時會引發異常。

如果您想使用集合初始值設定項語法,磁控管的答案就是這樣做的方法。 這對於鋸齒狀數組而不是二維數組會更好; 正如他指出的那樣,不可能進行編譯時檢查以確保初始化程序中的參數數量與矩陣的大小相匹配,因此僅初始化類就會冒運行時錯誤的風險。

另一種方法是實現一個替代構造函數,允許您初始化矩陣,如下所示:

public Matrix(double[,] source)
{
    m = source;
}

那么您的代碼行將如下所示:

Matrix a = new Matrix(new double[,]{ {1,2},{3,4} });

這將避免這個問題,因為矩陣的維數由初始化數據的維數決定,初始化數據必須是二維數組。

我知道我遲到了,但是double[,]的擴展方法,甚至實現隱式轉換呢?

class Matrix
{
    // Implicit cast
    public static implicit operator Matrix(double[,] array) => new Matrix(array);

    private double[,] source;
    public Matrix(double[,] source)
    {
        this.source = source;
    }
}
static class Extensions
{
    // Extension
    public static Matrix ToMatrix(this double[,] array)
    {
        return new Matrix(array);
    }
}
static class Program
{
    static void Main()
    {
        // Extension
        Matrix a = new double[,] {
            { 1.0, 2.0, 3.0 },
            { 1.0, 2.0, 3.0 },
            { 1.0, 2.0, 3.0 }
        }.ToMatrix();

        // Implicit cast
        Matrix b = new double[,] {
            { 1.0, 2.0, 3.0 },
            { 1.0, 2.0, 3.0 },
            { 1.0, 2.0, 3.0 }
        };
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM