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

何かが本質的に存在しない場合、それは作成できるものですか?

ありがとう、ティム

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

このようなインデックスの作成は、すべてのインデックスの「デカルト積」を使用して取得できます。これは、デカルト積を実行するためのLINQの良い方法はありますか?に基づくサンプルです。(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 に答える