1

Something like:

forelement (element G_Element, Grid)
{
    Grid[G_Element.dim1, G_Element.dim2] = 
        new clsGridElement(G_Element.dim1, G_Element.dim2);
}

instead of

for (int X = 0; X < GridWidth; X++) 
    for (int Y = 0; Y < GridHeight; Y++) 
        Grid[X, Y] = new clsGridElement(X, Y);

If something doesn't innately exist, is that something that could be created?

Thanks, Tim

4

3 回答 3

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);
}
于 2012-11-01T17:13:06.983 回答
2

不确定您在这里尝试做什么,或者为什么,或者您希望从中获得什么,但是如果您实现自己的迭代器而不是实现IEnumerator接口,那么您可以创建一些会击中 2D 中每个单元格的东西(或更多)收藏。

当然,与仅使用嵌套循环相比,您实际上不会从性能方面获得任何收益,但我想这将是语法糖。

于 2012-11-01T17:12:31.757 回答
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);
}
于 2012-11-01T17:26:22.223 回答