【问题标题】:Fetch (x,y) from a 2D Array where condition matches从条件匹配的二维数组中获取 (x,y)
【发布时间】:2013-10-04 21:53:26
【问题描述】:

这是二维数组:

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

【问题讨论】:

    标签: c# arrays linq enumerable


    【解决方案1】:
    var lst = array2D
        .SelectMany((innerArray, r)
            => Enumerable
                   .Range(0, innerArray.Length)
                   .Where(c => innerArray[c] == 0)
                   .Select(c => new Point(c, r)))
        .ToList();
    

    但是,您当前的解决方案更具可读性。

    【讨论】:

    • 您的第一个答案有效,但第二个答案不可编译,因为 Point 是结构,而不是类。因此,您不能将 null 类型转换为 Point。谢谢!
    【解决方案2】:

    诀窍是使用SelectSelectMany 将循环变量捕获为匿名类型,然后在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 的评论也适用于这个解决方案。不可读!

    【讨论】:

    • 您的解决方案给出了几乎正确的答案...实际上,您交换了 x 和 y。因此,该列表包含“Point(y, x)”数据。不过,数值是正确的。
    • 我认为LINQ 在很多情况下都是unreadable。查询越复杂,我们越能感觉到不可读,可能是因为它是succinctness
    【解决方案3】:

    试试这个:

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

    【讨论】:

    • 这不起作用:c 循环变量对过滤后的行进行操作,并且不会反映原始数组的索引。
    • 很多编辑,但你终于做对了 :) 这是最简洁的答案。我喜欢这个。
    • 你能用更好的变量名吗? :)
    • @Nayan rc 遵循您的原始代码,我不知道其他 mediate 变量名称。
    • @Nayan 其他 var 名称呢? a, b?很难从语义上给它们命名。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-20
    • 1970-01-01
    • 1970-01-01
    • 2012-08-06
    • 1970-01-01
    • 2016-01-12
    • 1970-01-01
    相关资源
    最近更新 更多