roleList是一个包含角色的字符串类型列表
List<string> designationlistForQuery = new List<string>();
roleList.ForEach(r =>
{
!r.Equals(shortDesignation) ? designationlistForQuery.Add(r) : delegate{};
});
但编译器告诉我:&#39; void&#39;之间没有隐式转换。和匿名方法&#39; 我怎么能解决这个问题,请有人帮助我。
答案 0 :(得分:3)
使用简单的foreach
运算符:
foreach(var role in roleList)
if (role.Equals(shortDesignation))
designationlistForQuery.Add(role);
或者
var rolesToAdd = roleList.Where(r => r.Equals(shortDesignation));
foreach(var role in rolesToAdd)
designationlistForQuery.Add(role);
答案 1 :(得分:2)
在这里使用conditional operator(这是它的名字,而不是三元运算符)是没有意义的。您是对每个项目执行操作,而不是返回值;条件运算符用于返回一个值,因此将它与void操作数一起使用是没有意义的。
答案 2 :(得分:0)
将?:
与没有返回值的方法一起使用是很奇怪的,但是如果你确实需要它,请将其换行为lambda,它返回一个伪值,如:
Func<int> action = condition ?
()=> { VoidMethod(); return 42;} :
(Func<int>)(()=>42);
注意:在这种情况下,你需要至少在类似(Func<int>)
之类的具体类型上进行转换,因为C#只能用2个lambdas来确定好的常见类型。
答案 3 :(得分:0)
看起来这就是你想要的,但这是一种残暴的语法:
roleList.ForEach(r =>
{
(!r.Equals(shortDesignation) ? (Action) (() => designationlistForQuery.Add(r)) : (Action) (() => { }))();
}
);
如果你想要它好又短,这里有一个选项:
designationlistForQuery.AddRange(roleList.Where(x => !x.Equals(shortDesignation)));
还有十几种其他方法可以写它,有些方法比其他方式更清晰 - 但我肯定会避免你的委托方法。