2012-11-01 114 views
1

喜欢的东西:的多维数组的自定义迭代?

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); 

如果事情不存在天生,是个可以创造出来的?

感谢, 添

+3

[的foreach(http://msdn.microsoft.com/en-us/library/ttw7t8t6%28v=vs.80%29。 C++); [IEnumerable](http://msdn.microsoft.com/en-us/library/system.collections.ienumerable.aspx)和[yield](http://msdn.microsoft.com/en-us/library/9k7k7cf0 %28v = vs.80%29.aspx)如果你正在编写自己的自定义迭代器。在你的例子中,for循环似乎更简单。 –

+0

查看“C#linq Cartesian product”搜索结果,构造合适的枚举。 Eric Lippert在这里有几个好帖子,像http://stackoverflow.com/questions/4073713/is-there-a-good-linq-way-to-do-a-cartesian-product和http:// stackoverflow .com/questions/4073713/is-there-a-good-linq-way-to-do-cartesian-product and –

回答

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); 
} 
2

不知道正是你正在尝试做的,或者为什么,或者你所期望的,从它那里得到,但是如果你实现你自己的迭代器不是,那么你可以实现IEnumerator接口创建一些能击中2D(或更多)集合中的每个单元格的东西。

当然,你不会真正从这个方面获得任何性能上的表现,而只是使用嵌套循环,但我想它会是语法糖。

0

这样的索引创建可以通过使用g所有指标的“笛卡尔积”。下面是基于Is there a good LINQ way to do a cartesian product?(在埃里克利珀提供)样品:

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); 
}