C# 三元运算符 ?: 效率

C# Ternary operator ?: efficiency

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

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

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 计数并显示结果.我的观点是,当有效地只需要存储值并在 else 中再次使用它时,它将 运行ning linq 查询两次。如果 linq 查询更大更复杂,这似乎非常低效。

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

更新:

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

I cannot store the value first to use again

为什么不呢?你一定可以。

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

您可以将计数结果保存在一个变量中,这样您就不会为 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()
      });

您也可以使用查询语法利用 let 子句来做到这一点:

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