使用三元运算符:"仅分配,调用,增量......"

Kam*_*ski 15 .net c#

我有动作字典定义为:

var actions = new Dictionary<string, Action<string, string>>();
Run Code Online (Sandbox Code Playgroud)

我把行动放在:

actions.Add("default", (value, key) => result.Compare(value, properties[key], Comparers.SomeComparer, key));
...
Run Code Online (Sandbox Code Playgroud)

我正在使用此代码来运行它:

if (actions.ContainsKey(pair.Key))
{
    actions[pair.Key](pair.Value, pair.Key);
}
else
{
    actions[""](pair.Value, pair.Key);
}
Run Code Online (Sandbox Code Playgroud)

它工作正常,但我想用'?' 缩短的注意事项:

actions.ContainsKey(pair.Key) ? actions[pair.Key](pair.Value, pair.Key) : actions[""](pair.Value, pair.Key);
Run Code Online (Sandbox Code Playgroud)

此代码显示错误:

错误1只能将赋值,调用,递增,递减和新对象表达式用作语句

actions[pair.Key](pair.Value, pair.Key) 不是电话吗?我错过了什么吗?是否可以使用'?' 动作词典的符号?我试图找到一些相关的东西,但很难找到关于'?'的任何内容.运算符和此错误,因为'?' 被谷歌忽略了.

Kun*_*han 20

试试这个:

actions[actions.ContainsKey(pair.Key) ? pair.key : ""](pair.Value, pair.Key);
Run Code Online (Sandbox Code Playgroud)

这将解决您的问题.

  • 我认为这段代码不应该取代原来的代码.仅仅因为它是一行代码并不是更好. (11认同)
  • 最好不要使用ternar运算符,因为你没有得到任何速度增加但是代码的可读性更差(标准编码实践),以防万一有人接管你的代码他会更容易阅读,否则然后是ternar运算符 (6认同)
  • 为什么我的朋友不是更好? (4认同)
  • 非常感谢,它帮助了我. (2认同)
  • 避免三元运算符与避免一元运算符一样有意义 - 避免任何运算符因为它们的arity对我来说没有多大意义 (2认同)
  • @GoranŠtuc但它不会在这里扼杀可读性(在我看来).对我来说,if/else片段是*verbose*而三元片段是*简洁*.当然,这是一个主观问题. (2认同)

Dam*_*ver 13

?:条件运算符被定义为:

条件运算符(?:) 根据布尔表达式的值返回两个值中的一个

你的行为没有返回一个值,那么返回值?:是什么意思?


Adr*_*der 7

如果你真的必须这样做,你可以试试

actions[actions.ContainsKey(pair.Key) ? pair.Key : ""](pair.Value, pair.Key);
Run Code Online (Sandbox Code Playgroud)

只是为了澄清,来自:运营商(C#参考)

条件必须评估为真或假.如果condition为true,则计算first_expression并成为结果.如果condition为false,则计算second_expression并成为结果.只评估两个表达式中的一个.

这是公平的

int input = Convert.ToInt32(Console.ReadLine());
string classify;

// if-else construction.
if (input < 0)
    classify = "negative";
else
    classify = "positive";

// ?: conditional operator.
classify = (input < 0) ? "negative" : "positive";
Run Code Online (Sandbox Code Playgroud)


Rob*_*edy 6

你的电话本身并没有错.表达actions[pair.Key](pair.Value, pair.Key)确实是一个电话.不过,这不是编译器抱怨的表达方式.编译器指的是整个条件运算符表达式,它既不是赋值,调用,递增,递减,也不是新对象表达式,因此不允许它本身作为语句.

替代方案包括以下内容:

  • 将表达式的结果分配给另一个变量,使条件只是较大赋值语句的子表达式
  • 将条件分解为索引表达式,因此整个语句是单个调用而不是两个单独的调用.
  • 使用两个独立的语句来决定使用哪个键,然后调用该函数:

    var key = actions.ContainsKey(pair.Key) ? pair.Key : "";
    actions[key](pair.Value, pair.Key);
    
    Run Code Online (Sandbox Code Playgroud)

    它仍然避免重复代码,但是通过不尝试将所有内容打包到一个复杂的语句中来使事情更容易阅读.