如何解决这种三元运算

本文关键字:三元 运算 解决 何解决 | 更新日期: 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确定良好的通用类型