1

これは 2D 配列です。

int[][] array2D = new int[7][];
for (int i = 0; i < 7; i++)
    array2D[i] = new int[7];

以下を LINQ クエリに変換したり、列挙可能なメソッドを使用して同じ出力を得るにはどうすればよいですか?

var lst = new List<Point>();

for (int r = 0; r < array2D.Length; r++)
    for (int c = 0; c < array2D[r].Length; c++)
        if (array2D[r][c] == 0)
            lst.Add(new Point(c, r));

編集 - @'King King's answer に基づくソリューション

var lst = m_boardArr.SelectMany((row, rowIndex) =>
            row.Select((val, colIndex) =>
                new { val, point = new Point(colIndex, rowIndex) })
                   .Where(col => col.val == 0)
                   .Select(col => col.point)).ToList();
4

3 に答える 3

1

これを試して:

var lst = array2D.SelectMany((x,r) => x.Select((a,c)=> new {a,b=new Point(c,r)})
                                       .Where(a=>a.a==0)
                                       .Select(a=>a.b)).ToList();
于 2013-09-28T18:56:32.880 に答える
1
var lst = array2D
    .SelectMany((innerArray, r)
        => Enumerable
               .Range(0, innerArray.Length)
               .Where(c => innerArray[c] == 0)
               .Select(c => new Point(c, r)))
    .ToList();

ただし、現在のソリューションはより読みやすくなっています。

于 2013-09-28T18:56:04.930 に答える
1

トリックは、ループ変数を匿名型にキャプチャするSelectandを使用し、後で句SelectManyの後にそれらのプロパティを取得することです。Where

var list = array2D
    .SelectMany((row, r) => row
        .Select((el, c) => 
        new {Element = el, ColIndex = c, RowIndex = r})
        .Where(thing => thing.Element == 0)
        .Select(thing => new Point(thing.RowIndex, thing.ColIndex)))
    .ToList();

編集: Bartosz のコメントは、このソリューションにも適用されます。判読不能!

于 2013-09-28T18:58:03.200 に答える