简单C#foreach to LINQ问题
目前有:简单C#foreach to LINQ问题,c#,linq,C#,Linq,目前有: foreach (var series in Chart1.Series) { series.Enabled = false; } 我想用一个简单的一行表达式来表达这一点。我认为这会奏效: Chart1.Series.Select( series => series.Enabled = false); 然而,这没有任何效果。大概是因为我误解了Select的工作原理,这很好 我的下一个想法是执行类似Chart1.Series.ForEach(Series=>Series
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没有实现IEnumerable(…或者至少ForEach不是一个可接受的调用方法)
我不想做
Chart1.Series=Chart1.Series.ToList().ForEach(Series=>Series.Enabled=false)代码>,但这可能是最简单的选择?您的第一个foreach循环非常清晰,而且可以工作,所以为什么需要用LINQ替换它,它不会更清晰或更快
否则我不认为它会比你上面说的更简单
Chart1.Series.ToList().ForEach( series => series.Enabled = false);
您想做的事情最好使用foreach
。您正在迭代一系列元素并修改这些元素。这就是foreach的作用
Linq用于获取一个元素序列,并基于某些标准/转换生成一个新序列。不是你想要的。简单一句:)
至于Select不起作用的具体原因,请记住Select返回一个IEnumerable
,这是一个知道如何枚举的对象。换句话说,您有一个可以枚举但尚未枚举的引用。所以如果你拿这个:
var series = Chart1.Series.Select( s => s.Enabled = false);
foreach (var s in series) {}
您将获得预期的效果,因为现在您正在枚举该系列,并因此调用Select委托。当然,这是非常不直观的,这就是为什么Select通常不以这种方式使用(否则每次枚举都会产生副作用,并且多次枚举会再次应用副作用。)转换到列表永远不会比只遍历元素更简单。LINQ代表语言集成查询。Enabled=false不是查询。foreach怎么了?哦,是的。你是对的——我回去查看了我之前的所有帖子,确保我接受并投票通过了相关的答案。但是,有一些人留下了没有帮助的回复。你可以尝试使用一个numerable()而不是ToList(),但我不确定你是否真的得到了什么…ToList()创建了数据的副本,对吗?我相信你的声明对Chart1.Series没有影响。我之所以改变它,是因为我正试图逐渐将自己介绍给更复杂的LINQ命令,但我没有太多的时间研究LINQ——所以我会尽可能地采取一些小的学习步骤。你试过了吗?引用数据的副本将完成实际数据的工作。在第一个示例中,变量series包含对series对象引用的副本。与ToList()创建新对象的方式相同,但包含对相同ItemsInTesting的引用!那个事实上,这解释了很多。谢谢
var series = Chart1.Series.Select( s => s.Enabled = false);
foreach (var s in series) {}