示例:
说我有
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 }
理想情况下,无需编写任何扩展方法,理想情况是以紧凑和高效的方式。
答案 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()
。
在这种情况下,我强烈建议使用静态助手或扩展方法: