如何解决这种三元运算
本文关键字:三元 运算 解决 何解决 | 更新日期: 2023-09-27 18:11:20
roleList是一个包含角色的字符串类型列表
List<string> designationlistForQuery = new List<string>();
roleList.ForEach(r =>
{
!r.Equals(shortDesignation) ? designationlistForQuery.Add(r) : delegate{};
});
但是编译器告诉我:'void'和'anonymous method'之间没有隐式转换
使用简单的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);
在这里使用条件运算符(这是它的名字,而不是三元运算符)没有意义。对每个项目执行操作,而不返回值;条件操作符用于返回值,因此将其与void操作数一起使用是没有意义的。
看起来这是您想要的,但是这是一个糟糕的语法:
roleList.ForEach(r =>
{
(!r.Equals(shortDesignation) ? (Action) (() => designationlistForQuery.Add(r)) : (Action) (() => { }))();
}
);
如果你想让它简洁,这里有一个选项:
designationlistForQuery.AddRange(roleList.Where(x => !x.Equals(shortDesignation)));
还有十几种其他的方法来写它,有些比其他的更清晰——但我绝对不会使用你的委托方法。
将?:
与不返回值的方法一起使用是很奇怪的,但是如果您确实需要它-将其包装成返回假值的lambda,如:
Func<int> action = condition ?
()=> { VoidMethod(); return 42;} :
(Func<int>)(()=>42);
注意:在这种情况下,您需要至少在一侧强制转换为具体类型,如(Func<int>)
,因为c#无法仅用2个lambdas确定良好的通用类型