是否有一种紧凑的方法来查找二维数组中元素出现的索引?

时间:2016-09-24 23:34:20

标签: c# .net algorithm linq

示例:

说我有

var arr = new int[][] { 
   { 1, 9, 4 }, 
   { 2, 4, 4 },
   { 3, 0, 5 }
};

并说我想要3的索引。所以我想要一个相当于

的方法
Tuple<int,int> indices; 
for(int i = 0; i < arr.Length; ++i)
   for(int j = 0; j < arr[i].Length; ++j)
      if(arr[i][j] == 3)
         return new Tuple<int,int>() { i, j }

理想情况下,无需编写任何扩展方法,理想情况是以紧凑和高效的方式。

1 个答案:

答案 0 :(得分:1)

你可以在LINQ中以“紧凑”的方式做到这一点 - 但是正如评论所暗示的那样,定期循环会破坏效率:

var indexes = arr.Select((a, x) => a.Select((v, y) => new { X = x, Y = y })
    .Where(z => arr[z.X][z.Y] == 3)).SelectMany(x => x);

即使使用LINQ,您仍然必须遍历整个集合并构建索引(此处为匿名类型)并确定它们是否符合您的条件(然后使用SelectMany展平结果)。

另请注意,这将返回所有实例,以便在第一次出现时只需在结尾处抛出.First()

在这种情况下,我强烈建议使用静态助手或扩展方法: