类似的东西:
forelement (element G_Element, Grid)
{
Grid[G_Element.dim1, G_Element.dim2] =
new clsGridElement(G_Element.dim1, G_Element.dim2);
}
而不是
for (int X = 0; X < GridWidth; X++)
for (int Y = 0; Y < GridHeight; Y++)
Grid[X, Y] = new clsGridElement(X, Y);
如果某些东西不存在,那是否可以创造出来?
谢谢, 添
答案 0 :(得分:6)
你可以这样做 - 只需制作一个暴露这些的自定义类型,并使用常规的foreach:
public class TwoDimensionalIterator
{
public TwoDimensionalIterator(int i, int j)
{
this.Dim1 = i; this.Dim2 = j;
}
public int Dim1 { get; private set; }
public int Dim2 { get; private set; }
}
然后在某处创建一个扩展方法来返回一个可枚举的:
public static IEnumerable<TwoDimensionalIterator> IterateTwoDim<T>(this T[,] array)
{
for (int i=0;i<array.GetLength(0);++i)
for (int j=0;i<array.GetLength(1);++j)
yield return new TwoDimensionalIterator(i,j);
}
有了这个,你就可以这样做:
foreach(var index in Grid.IterateTwoDim())
{
Grid[index.Dim1, index.Dim2] = new clsGridElement(index.Dim1, index.Dim2);
}
答案 1 :(得分:2)
不确定你到底想要做什么,或者为什么,或者你期望从中得到什么,但是如果你实现自己的迭代器而不是实现IEnumerator接口,那么你可以创建一些可以创建的东西2D(或更多)集合中的每个单元格。
当然,实际上你不会在这方面获得任何性能,只需使用嵌套循环,但我想这是语法糖。
答案 2 :(得分:0)
可以通过使用所有索引的“笛卡尔积”来获得索引的这种创建。以下是基于Is there a good LINQ way to do a cartesian product?的示例(由Eric Lippert提供):
var allIndexes = from dim1 in Enumerable.Range(0, Grid.GetLength(0))
from dim2 in Enumerable.Range(0, Grid.GetLength(1))
select new {dim1, dim2};
foreach (var G_Element in allIndexes)
{
Grid[G_Element.dim1, G_Element.dim2] =
new clsGridElement(G_Element.dim1, G_Element.dim2);
}