[英]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.