在genericsList的ForEach()中使用lambda表达式中的条件运算符?

是不是允许在ForEach中的lambda表达式中有一个条件运算符?

List items = new List{"Item 1", "Item 2", "Item I Care About"}; string whatICareAbout = ""; // doesn't compile :( items.ForEach(item => item.Contains("I Care About") ? whatICareAbout += item + "," : whatICareAbout += ""); 

编译错误 – >“只能将赋值,调用,递增,递减和新对象表达式用作语句”

尝试使用正常if也不起作用:

 // :( items.ForEach(item => if (item.Contains("I Care About")) {whatICareAbout += item + ", ";} 

只是不可能?

您正在使用较短forms的lambda表达式,它只允许单个表达式。
你需要长forms,它允许多个语句。

例如:

 items.ForEach(item => { if (item.Contains("I Care About")) whatICareAbout += item + ", "; }); 

你想要实现什么目标? 您是否尝试形成一串逗号分隔的项目,其中包含特定值? 在linq中,您可以使用以下方法实现此目的:

  List items = new List { "Item 1", "Item 2", "Item I Care About", "Item I Care About", "Item I Care About" }; string whatICareAbout = items.Where(x => x.Contains("I Care About")) .Aggregate( (y, z) => y + ", " + z); 

这个输出是“我关心的项目,我关心的项目,项目我关心的项目”。

注意:聚合是确保没有尾随“,”的好方法。

问题在于表达

 item.Contains("I Care About") ? whatICareAbout += item + "," : whatICareAbout += "" 

不是声明 。 它只返回一个具有类型string的值。

有一个技巧可以使它工作(只是为了好玩):

  items.ForEach(item => (item.Contains("I Care About") ? whatICareAbout += item + "," : whatICareAbout += "").GetType()); 

我只是添加了对.GetType()方法的调用,以从初始表达式创建一个语句,并进行编译。

试试括号:

 items.ForEach(item => item.Contains("I Care About") ? (whatICareAbout += item + ",") : (whatICareAbout += "") ); 

+ =具有比?更高的优先级,这可能是您收到错误的原因。 使用括号,错误可能会消失。 不是100%肯定这一点,但是…… lambda表达式可能有其他限制,阻止使用赋值语句。

更新:

而不是多个+ =语句,将条件放在赋值的右侧更加清晰,如下所示:

 List items = new List { "one", "two", "three" }; string whatICareAbout = ""; items.ForEach(item => whatICareAbout += item.Contains("I Care About") ? (item + ",") : ""); 

更新2:

但是使用Aggregate()更好,因为它专为这种情况而设计。 这是一个样本:

 string whatICareAbout = items.Aggregate("", (total, item) => item.Contains("I Care About") ? (total + item + ",") : total); 

但我认为@Matt Breckon上面的答案(我刚刚看到我要发布的内容)甚至比我的例子更好,因为它涉及删除终端“,”。 看看他的回答…… 🙂