【问题标题】:Is there a compact way to find the indices of an occurrence of an element in a 2-D array?有没有一种紧凑的方法来查找二维数组中某个元素出现的索引?
【发布时间】:2016-09-24 23:34:20
【问题描述】:

示例:

说我有

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 }

理想情况下无需编写任何扩展方法,并且最好以紧凑高效的方式进行。

【问题讨论】:

  • 你确定var arr = new int[][] 而不是new int[,] 因为定义的方式,示例无法编译。换句话说,您要的是 jagged 还是 2d 数组。
  • @IvanStoev 我不想要[,],因为那样我就不能在上面使用 LINQ
  • 然后正确调用它并使用编译的例子。
  • 您的for loop 是您在示例和规范中可以获得的最佳效率。
  • 在不提供minimal reproducible example 的情况下错误地调用是一种主要的、超级优雅的方式,适用于每个不是失败者的人

标签: c# .net algorithm linq


【解决方案1】:

您可以在 LINQ 中以“紧凑”的方式执行此操作 - 但正如 cmets 建议的那样,常规循环会提高效率:

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

在这种情况下,我强烈推荐使用静态帮助程序或扩展方法:

【讨论】:

    猜你喜欢
    • 2021-11-13
    • 1970-01-01
    • 2019-08-15
    • 1970-01-01
    • 2013-11-16
    • 1970-01-01
    • 2022-11-19
    • 1970-01-01
    • 2020-10-17
    相关资源
    最近更新 更多