2011-05-20 56 views
2

目前有这样的:简单的C#的foreach对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);,但也许这是最简单的选项?

+0

转换为列表不会比简单地通过元素简单。 – ariel 2011-05-20 00:05:34

+0

LINQ代表语言集成查询。 Enabled = false不是查询。 foreach有什么问题? – GregC 2011-05-20 00:05:53

+0

哎呀,是的。你是对的 - 我回头浏览了我以前的所有主题,并确定我接受并投票了相关答案。尽管如此,一些人留下的回应没有任何帮助。 – 2011-05-20 00:15:51

回答

6

foreach是首选你想做什么简单。您正在遍历一系列元素并修改元素。这就是foreach的用途。

LINQ的用于摄取元件中的一个序列,并基于某些准则/变换的新序列。不是你在追求什么。

0

你的第一个foreach循环是很明显,它的工作原理,那么为什么需要使用LINQ来取代它,它不会是更清晰或更快。

否则我不认为它会比你说什么上面

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

ToList()创建数据的副本,是否正确?我相信你的陈述对Chart1.Series没有任何影响。我正在改变它,只是因为我试图逐渐将自己介绍给更复杂的LINQ命令,但没有大量时间来研究LINQ - 所以我会尽可能采取小的学习步骤。 – 2011-05-20 00:06:42

+0

你试过了吗?参考数据的副本也将为实际数据执行作业 – 2011-05-20 00:13:18

+0

在第一个示例中,变量系列包含对系列对象的引用副本。ToList()将创建一个新对象,但包含对相同项目的引用的相同方式 – 2011-05-20 00:13:57

1

简单一线:)

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

至于具体的原因,你的选择没有工作,记住,选择返回IEnumerable<T>,这是一个知道如何枚举的对象。换句话说,你有一个可以枚举的东西,但还没有被列举。所以,如果你把这个:

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

你会得到你想要的效果,因为现在你列举系列,因此调用选择委托。这是相当不直观,当然,这也是为什么选择一般不采用这种方式(否则每次枚举的时候,你就会有副作用,列举不止一次将再次申请的副作用)。