代码之家  ›  专栏  ›  技术社区  ›  Martin

如果Sum()值返回Null,则使用0,当前是否将其强制转换为可为Null的double?

  •  1
  • Martin  · 技术社区  · 15 年前

    我有一个LINQ的声明,它工作得很好。。。这是精选的一部分

     select new
     {
         Net = (System.Double?)
         ((from m0 in MOVTOS
         where m0.DocumentType == "NET" && m0.ClientCode == c.ClientCode
         group m0 by new { 0.ClientCode } into g
         select new
         {
             Expr1 = (System.Double)g.Sum(p => p.Amount)
         }).First().Expr1)
    };
    

    如果你注意到我在用 System.Double? (可为空的double)由于某些值在求和时返回为空而在求和时进行转换。

    如果我把它改成系统,它会加倍失败

    不能将空值分配给类型为System.Double的成员,它是不可为空的值类型

    所以我想做的是返回和的值,但是如果它是空的,那么在这里输入一个0。

    感谢你的帮助

    4 回复  |  直到 15 年前
        1
  •  5
  •   Thomas Levesque    15 年前

    使用 null coalescing operator :

    double? nullable = null;
    double notNullable = nullable ?? 0;
    

    就你而言:

    select new
    {
        Net =
            (from m0 in MOVTOS
             where m0.DocumentType == "NET" && m0.ClientCode == c.ClientCode
             group m0 by new { 0.ClientCode } into g
             select g.Sum(p => p.Amount) ?? 0).First()
    };
    
        2
  •  1
  •   The Smallest    15 年前

    简单地添加 ?? 0

    改变 .First().Expr1) .First().Expr1) ?? 0

        3
  •  0
  •   Viper    15 年前

    或者你可以过滤你的收藏 g 因此。。。

    List<double?> dArr = new List<double?>( )
    {
       1,
       3,
       null,
       5
    };
    
    double sum = dArr.Select( item =>
       {
           if( item.HasValue == false )
              return 0;
           else
              return item;
       } ).Sum( item => item.Value );
    
        4
  •  0
  •   jackvsworld    13 年前

    而不是 Sum 你可以使用 Aggregate 方法的种子 0.0 . 这不需要使用可空类型或显式强制转换。

    select new
    {
        Net =
        ((from m0 in MOVTOS
        where m0.DocumentType == "NET" && m0.ClientCode == c.ClientCode
        group m0 by new { 0.ClientCode } into g
        select new
        {
            Expr1 = g.Aggregate(0.0, (a, p) => a + p.Amount)
        }).First().Expr1)
    };