使用LINQ

时间:2015-11-18 15:55:32

标签: c# linq nested-lists

如果您有List类型的嵌套T

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子句按我的意图返回类型List<List<T>>而不是List<T>

所以这个问题有两条路径(答案就足够了):

  1. 避免循环,如何枚举列表中的所有项目?
  2. 如何使用任何其他简单方法获得一行?
  3. 如果所有其他方法都失败了,我也可以创建一个类来表示这个嵌套列表,但是我想阻止它,因为它会是一个单例。

1 个答案:

答案 0 :(得分:1)

如果您确定每列有5行,则可以选择该索引。

var fifthRow = foo.Select(x => x[4]).ToList();

或者更安全的选择是

var fifthRow = foo.Select(x => x.Skip(4).FirstOrDefault()).ToList();

由于任何没有至少5行的列都会生成T的默认值。

请注意,这是一个包含该行值的新列表,因此无法用于更新foo中的值。