【问题标题】:C# Ternary operator ?: efficiencyC# 三元运算符?:效率
【发布时间】:2016-04-02 00:44:34
【问题描述】:

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

鉴于我们有两个列表,我们希望使用 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 并显示“未找到”,否则它将再次运行 linq 计数并显示结果。我的观点是,当它只需要存储值并在 else 中再次使用它时,它将运行两次 linq 查询。如果 linq 查询更大更复杂,这似乎非常低效。

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

更新:

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

【问题讨论】:

  • 这还能编译吗?您的条件运算符返回 intstring
  • 慢的不是三元运算符。
  • 性能低下是因为myList2.Count(y =&gt; y == x)改成myList2.Where(y =&gt; y == x).Count()
  • @EʜsᴀɴSᴀᴊᴊᴀᴅ,没有。只是没有。

标签: c# linq ternary-operator


【解决方案1】:

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

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

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

【讨论】:

  • 我不知道你可以像这样在 lambda 中声明变量,非常好。
  • 很好的答案我也不知道。我认为 'let' 或 lambda 查询中的等效选择是要走的路。
【解决方案2】:

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

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

【讨论】:

  • @JamesDev 这确实是一种更通用的方法,因为它也适用于IQueryables。但是对于IEnumerables,另一个答案效率更高一些,因为它避免了中间投影。我都赞成:)
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 2011-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-16
    • 1970-01-01
    • 1970-01-01
    • 2014-02-08
    • 2023-03-05
    相关资源
    最近更新 更多