使用 LINQ 在嵌套列表中查找行
Finding row in Nested List using LINQ
如果您有一个类型为 T
的嵌套 List
:
List<List<T>> foo = new List<List<T>>();
而你假设内部列表中的元素是列,那么最优雅的获取行的方式是什么?这就是我的意思(如果您需要更多详细信息):
添加元素(假设列表已经初始化)
for (int x = 0; x < 5; x++)
for (int y = 5; y < 10; y++)
foo[x][y] = y + x; // some weird value
因此,因此,获取列很简单(也是我将此方法替换为二维数组的最大原因):
// 5th column
foo[5];
但是你怎么会吵架呢?我正在尝试这样的事情(第 5 行):
// 5th row ??
foo.Where(sublist => true).Where(item => item.Y == 5);
// (Assume the objects have a Y property that reflects its coordinate)
但似乎第一个 Where
子句 returns 类型 List<List<T>>
而不是我预期的 List<T>
。
所以这个问题有两条路径(任何一个答案都可以):
- 避免循环,如何枚举列表中的所有项目?
- 如何使用任何其他简单方法获得一行?
如果所有其他方法都失败了,我也可以制作一个 class 来表示这个嵌套列表,但我想避免这样做,因为它是一个单例。
如果您确定每列有 5 行,您可以 select 该索引。
var fifthRow = foo.Select(x => x[4]).ToList();
或者更安全的选择是
var fifthRow = foo.Select(x => x.Skip(4).FirstOrDefault()).ToList();
因为没有至少 5 行的任何列都会生成 T
的默认值。
请注意,这将是一个包含该行值的新列表,因此不能用于更新 foo
中的值。
如果您有一个类型为 T
的嵌套 List
:
List<List<T>> foo = new List<List<T>>();
而你假设内部列表中的元素是列,那么最优雅的获取行的方式是什么?这就是我的意思(如果您需要更多详细信息):
添加元素(假设列表已经初始化)
for (int x = 0; x < 5; x++)
for (int y = 5; y < 10; y++)
foo[x][y] = y + x; // some weird value
因此,因此,获取列很简单(也是我将此方法替换为二维数组的最大原因):
// 5th column
foo[5];
但是你怎么会吵架呢?我正在尝试这样的事情(第 5 行):
// 5th row ??
foo.Where(sublist => true).Where(item => item.Y == 5);
// (Assume the objects have a Y property that reflects its coordinate)
但似乎第一个 Where
子句 returns 类型 List<List<T>>
而不是我预期的 List<T>
。
所以这个问题有两条路径(任何一个答案都可以):
- 避免循环,如何枚举列表中的所有项目?
- 如何使用任何其他简单方法获得一行?
如果所有其他方法都失败了,我也可以制作一个 class 来表示这个嵌套列表,但我想避免这样做,因为它是一个单例。
如果您确定每列有 5 行,您可以 select 该索引。
var fifthRow = foo.Select(x => x[4]).ToList();
或者更安全的选择是
var fifthRow = foo.Select(x => x.Skip(4).FirstOrDefault()).ToList();
因为没有至少 5 行的任何列都会生成 T
的默认值。
请注意,这将是一个包含该行值的新列表,因此不能用于更新 foo
中的值。