Lambda ForEach with Index

时间:2014-10-30 15:19:56

标签: c# lambda

以下是列名列表:

var colNames = new List<string> { "colE", "colL", "colO", "colN" };

根据列表中列名的位置,我想让该列的可见索引等于列名的位置,但不返回列表。换句话说,下面没有“ToList()”的lambda表达式:

colNames.Select((x, index) => { grid_ctrl.Columns[x].VisibleIndex = index; return x; }).ToList();

这可以用单行lambda表达式编码吗?

2 个答案:

答案 0 :(得分:2)

使用循环来产生副作用。使用查询从现有数据计算新数据:

var updates =
 colNames.Select((x, index) => new { col = grid_ctrl.Columns[x].VisibleIndex, index })
 .ToList();

foreach (var u in updates)
 u.col.VisibleIndex = u.index;

隐藏查询中的副作用可能会产生令人讨厌的惊喜。我们仍然可以使用查询来完成大部分工作。

你也可以使用List.ForEach来制造这些副作用。但是,这种方法不是很容易扩展。它不像查询那样通用。

答案 1 :(得分:0)

是的,你在这里:

colNames.ForEach((x) => grid_ctrl.Columns[x].VisibleIndex = colNames.IndexOf(x));

请注意,列表中需要唯一的字符串,否则.IndexOf的行为会很糟糕。 不幸的是LINQ .ForEach,因为它的相对foreach没有提供枚举索引。