简单的C#foreach到LINQ问题

时间:2011-05-20 00:02:42

标签: c# linq

目前有这个:

foreach (var series in Chart1.Series)
{
    series.Enabled = false;
}

我想用简单的一行表达来表达这一点。我认为这样可行:

Chart1.Series.Select( series => series.Enabled = false);

然而,这没有任何效果。大概是因为我误解了Select是如何工作的,这很好。

我的下一个想法是做一些像Chart1.Series.ForEach(series => series.Enabled = false),但Chart1.Series没有实现IEnumberable(..或至少ForEach不是一个可接受的方法来调用)。

我宁愿不做Chart1.Series = Chart1.Series.ToList().ForEach( series => series.Enabled = false);,但也许这是最简单的选择?

4 个答案:

答案 0 :(得分:6)

foreach是您尝试做的首选。您正在迭代一系列元素并修改元素。这就是foreach的用途。

Linq用于获取一个元素序列并根据某些条件/转换生成新序列。不是你想要的。

答案 1 :(得分:1)

简单和一行:)

foreach (var series in Chart1.Series) { series.Enabled = false; }

答案 2 :(得分:0)

你的第一个foreach循环非常清晰且有效,所以为什么需要用LINQ替换它,它不会更清晰或更快。

否则我不认为它会比你上面说的更简单

Chart1.Series.ToList().ForEach( series => series.Enabled = false);

答案 3 :(得分:0)

至于您的Select不起作用的具体原因,请记住Select返回IEnumerable<T>,这是一个知道如何枚举的对象。换句话说,您可以引用可枚举的内容,但尚未枚举。所以,如果你这样做:

var series = Chart1.Series.Select( s => s.Enabled = false);
foreach (var s in series) {}

您将获得预期的效果,因为现在您正在枚举系列并因此调用Select委托。当然,这是非直观的,这就是为什么Select通常不会以这种方式使用的原因(否则每次枚举时,你都会有副作用并且不止一次枚举会再次应用副作用。)