简单的 C# for each to LINQ 问题



目前有这个:

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

我想用一个简单的一行表达来表达这一点。我认为这会起作用:

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

但是,这没有任何效果。大概是因为我只是误解了 Select 的工作原理,这很好。

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

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

对于您要执行的操作,首选foreach。 您正在循环访问一系列元素并修改这些元素。 这就是foreach的目的。

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

简单,一行:)

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

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

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

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

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

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

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

最新更新