繁体   English   中英

C#实现类,其行为类似于2dim数组

[英]C# implement class which behaves like 2dim array

是否可以创建自定义集合,该集合将具有类似于2dim数组的初始化语法,例如:

var matrix = new Matrix(){{1,1},{2,2}};

编辑

我了解这似乎是一个非常常见的问题,但索引器不是问题,问题在于初始化语法。 这是我的小想法。 那么,是否有可能获得完全相同的表达式? 我得到的最相似的词是:

var matrix = new Matrix() { new List<int>() {1, 2} };

为了实现你可以用集合初始化你的对象,但只有当该对象实现初始化语法的实现IEnumerable

如果该对象实现IEnumerable则可以添加在初始化对象时将调用的Add方法。 例如,这里是如何初始化简单矩阵类中的条目的方法:

public class Matrix : IEnumerable
{
    public int[,] _data = new int[3,3];

    public void Add(int x, int y, int value)
    {
        _data[x,y] = value;
    }
    public IEnumerator GetEnumerator()
    {
        throw new NotImplementedException();
    }    
}

我可以这样初始化它:

var myObject = new Matrix() {
    {1,2,3}, 
    {0,0,10}
};

这相当于写作:

var myObject = new Matrix();
myObject.Add(1,2,3);
myObject.Add(0,0,10);

自定义集合初始化程序是有关自定义集合初始化程序的问题,除其他事项外,该规范还引用了有关它们的规范。

如前所述,这仅适用于实现IEnumerable对象。 如上所示,您不必具有IEnumerable有用实现即可工作,但是如果对象不是真正的IEnumerable我不鼓励您使IEnumerable产生此行为。

public int this[int index1, int index2] { 
    // This is the get accessor. 
    get { 
        return index1 + index2;
    }
}

来源: http//www.java2s.com/Tutorial/CSharp/0140__Class/AtwoDimensionindexer.htm

如果要使用数组初始化语法,只需添加一个Add方法并实现IEnumerable

 public void Add(int a, int b) { ... }

您可以使用内部列表模拟它,例如:

为了使其安全(ish),您需要添加大量检查,以使其可以通过您的Initializerlist起作用,您可以提供IEnumerable构造函数并将其传递给它。

AFAIK无法实现“自动解构”矩阵的愿望。

    // main method - declares a matrix, fills one value, prints all
    static void Main()
    {
        Mat m = new Mat(8, 8);
        m[4, 2] = 55;

        Console.WriteLine(m);
        Console.ReadLine();
    }

    private class Mat
    {
        public Mat(int mRow, int mCol)
        {
            maxCol = mCol;
            maxRow = mRow;
            // prefill data with 0 - could use default
            data = new List<int>(Enumerable.Range(0, mCol * mRow).Select(n => 0)); 
        }

        // https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/indexers/
        public int this[int row, int col]
        {
            get
            {
                return data[row * maxCol + col];
            }
            set { data[row * maxCol + col] = value; }
        }

        // lenghty to string method 
        public override string ToString()
        {
            var sb = new StringBuilder();
            sb.Append("[ ");
            for (int r = 0; r < maxRow; r++)
            {
                sb.Append("[ ");

                for (int c = 0; c < maxCol; c++)
                {
                    sb.Append(this[r, c]);
                    if (c < maxCol - 1)
                        sb.Append(", ");
                }
                sb.Append(" ]\n");
                if (r < maxRow - 1)
                    sb.Append(", ");
            }
            sb.Append(" ]\n");
            return sb.ToString();
        }

        private int maxCol;
        private int maxRow;
        private List<int> data { get; set; }
    }
class Matrix : IEnumerable
{
    List<int[]> rowList = new List<int[]>();

    public void Add(params int[] row)
    {
        rowList.Add(row);
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return rowList.GetEnumerator();
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM