【问题标题】:Alternative to using a ternary operator in Lambda在 Lambda 中使用三元运算符的替代方法
【发布时间】:2013-06-17 15:17:06
【问题描述】:

目前..我的代码如下所示。

PhoneNumber = x.PhoneNumbers.FirstOrDefault() != null ? x.PhoneNumbers.FirstOrDefault().PhoneNumber : string.Empty,

PhoneNumbers 是 ICollection<PhoneNumber>

这也在.Select()中,所以我不能真正在外面为它创建一个变量。

Resharper 抱怨 x.PhoneNumbers.FirstOrDefault() 可能为空,老实说,并不是因为我必须执行两次 FirstOrDefault 的想法而出售。

任何其他想法,我在想可能有另一种 Lambda 方法我可以做类似的事情。

【问题讨论】:

  • 嗯,该代码的最大问题是您将序列迭代两次。如果它代表一个数据库查询(似乎是这种情况),那......非常糟糕。
  • 我同意,这绝对不是最好的主意,因为这是我将数据库中的结果操作到模型中
  • 由于这是来自数据库,最好简单地使用存储过程并将结果映射到复杂类型。在为报告/显示目的加入和聚合数据的情况下,我已经这样做了。

标签: c# linq lambda resharper ternary-operator


【解决方案1】:
PhoneNumber = x.PhoneNumbers.Select(pn => pn.PhoneNumber).FirstOrDefault() ?? "",

【讨论】:

    【解决方案2】:

    第一个选项,如 Markus 的:

    PhoneNumber = x.PhoneNumbers.Select(x => x.PhoneNumber)
                                .FirstOrDefault() ?? "";
    

    另一种选择:

    PhoneNumber = x.PhoneNumbers.Select(x => x.PhoneNumber)
                                .DefaultIfEmpty("")
                                .First();
    

    或者,如果您发现自己经常这样做,您可以编写自己的方法来将两者结合起来:

    public static TElement ProjectedFirstOrDefault<TSource, TElement>
        (this IEnumerable<TSource> source,
         Func<TSource, TElement> selector,
         TElement defaultValue) where TElement : class
    {
        var firstElement = source.FirstOrDefault();
        return firstElement == null ? defaultValue : selector(firstElement);
    }
    

    然后:

    PhoneNumber = x.PhoneNumbers.ProjectedFirstOrDefault(x => x.PhoneNumber, "");
    

    【讨论】:

    • @Servy:嗯,这要么是提供替代方案,要么只是删除我的答案。 (事实上​​,在我想到替代方案之前,我确实删除了我的答案。)
    【解决方案3】:
    var result = new List<Product>();
    
    result = result.Where(o => o.Name == (string.IsNullOrEmpty(_nameParameter) ? o.Name : _nameParameter)).ToList();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-15
      • 2020-10-06
      • 2023-04-10
      • 2014-11-13
      • 2022-01-21
      • 2020-11-01
      • 1970-01-01
      • 2021-08-20
      相关资源
      最近更新 更多