如何解决这种三元运作

时间:2014-07-02 16:10:31

标签: c# linq

roleList是一个包含角色的字符串类型列表

List<string> designationlistForQuery = new List<string>();
  roleList.ForEach(r =>
       {
  !r.Equals(shortDesignation) ?   designationlistForQuery.Add(r) : delegate{};


      });

但编译器告诉我:&#39; void&#39;之间没有隐式转换。和匿名方法&#39; 我怎么能解决这个问题,请有人帮助我。

4 个答案:

答案 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)));

还有十几种其他方法可以写它,有些方法比其他方式更清晰 - 但我肯定会避免你的委托方法。