C#三元运算符?:效率

时间:2016-04-01 13:59:22

标签: 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()
      });

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

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

更新

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

3 个答案:

答案 0 :(得分:12)

  

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

为什么不呢?你当然可以。

addObj()

答案 1 :(得分:7)

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

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

答案 2 :(得分:1)

您可以将计数结果保存在变量中,因此myList1中的每一行都不会计数2次。 代码:

var myList1 = new List<string>();
var myList2 = new List<string>();
int counter = 0;
var result = 
      myList1.Select(x => new {
          Id = x
          Count = (counter = myList2.Count(y => y == x)) == 0 ? "Not Found" : counter.ToString()
      });