C#三元运算符?:效率

Jam*_*Dev 0 c# linq ternary-operator

我正在使用三元运算符,但它具有很大的性能效率低下是否有一个等效的解决方案来解决效率问题?

鉴于我们有两个列表,我们希望从一个使用linq中选择:

var myList1 = new List<string>();
var myList2 = new List<string>();

var result = 
      myList1.Select(x => new {
      Id = x,
      Count = myList2.Count(y => y == x) == 0 ? "Not Found" 
                                              : myList2.Count(y => y == x).ToString()
      });
Run Code Online (Sandbox Code Playgroud)

现在使用三元运算符?:我在这里显示了linq表达式将检查计数是否为0并显示"未找到"否则它将再次运行linq计数并显示结果.我的观点是它将运行linq查询两次,实际上它只需要存储值并在else中再次使用它.如果linq查询更大更复杂,这似乎非常低效.

我知道三元运算符只应用于简单的方程式,例如i> 1?true:false但是在linq查询中有什么替代方法,因为我无法再次存储该值以再次使用.

更新:

这是关于三元运算符的理论问题,因为如果条件适用,它需要运行相同的方程两次.方程式大而复杂时使用效率太高?

Luc*_*ski 12

我无法再次存储该值以再次使用

为什么不?你确定可以.

var result = myList1.Select(x => {
    var count = myList2.Count(y => y == x);
    return new {
        Id = x,
        Count = count == 0 ? "Not Found" : count.ToString();
    };
});
Run Code Online (Sandbox Code Playgroud)


oct*_*ccl 7

您也可以使用带有let子句的查询语法来执行此操作:

var result = from e in myList1
             let count = myList2.Count(y => y == e)
             select new { Count = count == 0 ? "Not Found" : count.ToString()};
Run Code Online (Sandbox Code Playgroud)