不允许在ForEach中的lambda表达式中使用条件运算符吗?
List<string> items = new List<string>{"Item 1", "Item 2", "Item I Care About"};
string whatICareAbout = "";
// doesn't compile :(
items.ForEach(item => item.Contains("I Care About") ?
whatICareAbout += item + "," : whatICareAbout += "");
编译错误 - &gt; “只有赋值,调用,递增,递减和新对象表达式才能用作语句”
尝试使用普通if也不起作用:
// :(
items.ForEach(item => if (item.Contains("I Care About")) {whatICareAbout += item + ", ";}
只是不可能?
答案 0 :(得分:29)
您正在使用较短形式的lambda表达式,它只允许单个表达式 你需要长形式,这允许多个陈述。
例如:
items.ForEach(item => {
if (item.Contains("I Care About"))
whatICareAbout += item + ", ";
});
答案 1 :(得分:5)
你想要实现什么?您是否尝试形成一串逗号分隔的项目,其中包含特定值?在linq中,您可以使用以下方法实现此目的:
List<string> items = new List<string> { "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);
这个的输出是“我关心的项目,我关心的项目,我关心的项目”。
注意:聚合是确保没有尾随“,”
的好方法答案 2 :(得分:4)
问题在于表达
item.Contains("I Care About") ? whatICareAbout += item + "," : whatICareAbout += ""
不是声明。它只返回一个类型为string
的值。
有一个技巧可以让它起作用(只是为了好玩):
items.ForEach(item => (item.Contains("I Care About") ?
whatICareAbout += item + "," : whatICareAbout += "").GetType());
我只是添加了对.GetType()
方法的调用,以便从初始表达式创建一个语句,并进行编译。
答案 3 :(得分:1)
尝试使用括号:
items.ForEach(item => item.Contains("I Care About") ? (whatICareAbout += item + ",") : (whatICareAbout += "") );
+ =的优先级高于?,这可能就是您收到错误的原因。使用括号,错误可能会消失。不是100%肯定这一点,但是...... lambda表达式可能有其他限制,阻止使用赋值语句。
更新:
而不是多个+ =语句,将条件放在赋值的右侧更加清晰,如下所示:
List<string> items = new List<string> { "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's上面的答案(我刚刚看到我要发布的内容)甚至比我的例子更好,因为它涉及删除终端“,”。看看他的回答......: - )