2

と呼ばれるクラスがありますMatrix : IEnumerable<double>(古典的な数学行列。基本的には、いくつかの機能を備えた2D配列です)。

クラスは不変であるため、インスタンスの作成後にその値を変更する方法はありません。

既存の値で行列を作成したい場合は、次のように配列をコンストラクターに渡す必要があります。

double[,] arr = new double[,]
{
    {1,2,3}, {4,5,6}, {7,8,9}
};
Matrix m = new Matrix(arr);

これを次のようにする方法はありますか: (?)

Matrix m = new Matrix
{
    {1,2,3}, {4,5,6}, {7,8,9}
};

アップデート:

それを機能させるハックっぽい方法を見つけました。この解決策が適切かどうかはわかりませんが、うまくいきます。

class Matrix : ICloneable, IEnumerable<double>
{
        // Height & Width are initialized in a constructor beforehand.
        /*
         * Usage:
         * var mat = new Matrix(3, 4)
         * {
         *              {1,2,3}, {4,5,6}, {7,8,9}, {10,11,12}
         * };
         */
        int rowIndex;
        bool allowArrayInitializer;
        double[,] tempData;
        double[,] data;
        public void Add(params double[] args)
        {
                if(!allowArrayInitializer)
                        throw new InvalidOperationException("Cannot use array initializer");
                if(args.Length != Width || rowIndex >= Height)
                        throw new InvalidOperationException("Invalid array initializer.");
                for(int i = 0; i < Width; i++)
                        tempData[i, rowIndex] = args[i];
                if(++rowIndex == Height)
                        data = tempData;
        }
}
4

3 に答える 3

5

不変の場合はそうではありません。そのシンタックス シュガーは を使用して実装されAdd()ます。

于 2013-07-07T16:08:29.250 に答える
0

イニシャライザ経由では実行できませんが、パラメータ化されたコンストラクタ経由で実行できるはずです。以下にサンプルコードを示します。

class Matrix : IEnumerable<double>
{
    double[,] input;
    public Matrix(double[,] inputArray)
    {
        input = inputArray;
    }

    public IEnumerator<double> GetEnumerator()
    {
        return (IEnumerator<double>)input.GetEnumerator();
    }

    System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
    {
        return input.GetEnumerator();
    }
}

メインメソッドでは:

    static void Main(string[] args)
    {
        var m = new Matrix(new double[,] { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } });
    }

これがお役に立てば幸いです。

于 2013-07-07T16:56:26.167 に答える