MikeG
MikeG

Reputation: 545

Lambda ForEach with Index

Here are a list of column names:

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

Based on the position of the column names in the list, I want to make that column's visible index equal to the position of the column name, but without returning a list. In other words, the following lambda expression without "ToList()" at the end:

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

Can this be coded in a one-line lambda expression?

Upvotes: 2

Views: 10209

Answers (2)

Teejay
Teejay

Reputation: 7501

Yes, here you are:

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

Note that you need unique strings in your list, otherwise .IndexOf will behave badly. Unfortunately LINQ .ForEach, as its relative foreach doesn't provide an enumeration index.

Upvotes: 0

usr
usr

Reputation: 171246

Use a loop to make side-effects. Use queries to compute new data from existing data:

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;

Hiding side-effects in queries can make for nasty surprises. We can still use a query to do the bulk of the work.

You could also use List.ForEach to make those side-effects. That approach is not very extensible, however. It is not as general as a query.

Upvotes: 2

Related Questions