【问题标题】:Default Value when using SingleOrDefault()使用 SingleOrDefault() 时的默认值
【发布时间】:2014-08-05 19:48:38
【问题描述】:

所以,如果我有一个简单的类,比如:

class Color
{
    public int ID { get; set; }
    public string ColorName { get; set; }
}

然后创建这些对象的集合:

List<Color> ColorList;

然后我想用 LINQ 查询这个集合。

Color selected = ColorList.SingleOrDefault(a => a.ID == someVariable);

我的收藏将有几种颜色,所有颜色都有唯一的 ID,还有一种我想成为默认颜色。我正在寻找的是能够指定当 someVariable 与集合中的任何 ID 不匹配时返回的内容。这可能吗,还是 SingleOrDefault 仅在未找到匹配项时才返回 null?

【问题讨论】:

    标签: c# .net linq


    【解决方案1】:

    因为Color是一个类,所以默认值为null。所以你可以像这样使用null-coalescing operator (??):

    Color selected = ColorList.SingleOrDefault(a => a.ID == someVariable) ?? defaultValue;
    

    【讨论】:

    • 非常感谢。快速回复。这可行,但我想指出在这种情况下 defaultValue 是颜色类的单独实例,而不是查询集合的一部分。
    • @reckless76 正确。 defaultValue 可能是另一个实例,也可能是函数调用(例如GetDefaultColor()),甚至是像new Color … 这样的表达式。
    【解决方案2】:

    SingleOrDefault 仅在未找到匹配实例时返回类型的默认值。在这种情况下,它将是null

    您可以编写自己的扩展:

    private static readonly Color defaultValue = new Color(/* params */);
    
    public static Color SingleOrMyDefault(
              this IEnumerable<Color> source, 
               Func<Color, bool> predicate)
    {
         return source.SingleOrDefault(predicate) ?? defaultValue;
    }
    

    用法:

    var color = ColorList.SingleOrMyDefault(a => a.Id == 2);
    

    【讨论】:

      【解决方案3】:

      使用?? (null coalescing operator)

      Color selected = ColorList.SingleOrDefault(a => a.ID == someVariable) ?? 
                                new Color {Id = 1234, ColorName = "Blue"}; //Default value
      

      【讨论】:

        【解决方案4】:

        您可以尝试使用空合并,因为您无法为引用类型指定默认值:

        Color selected = ColorList.SingleOrDefault(a => a.ID == someVariable) ?? DefaultValue;
        

        【讨论】:

          【解决方案5】:

          不幸的是 SingleOrDefault 将返回单个值 Default(T)。你能做的最好的事情是这样的:

          Color defaultColor;
          
          var single = ColorList.SingleOrDefault(a => a.ID == someVariable);
          single = selected == null ? defaultColor : single;
          

          【讨论】:

            【解决方案6】:

            我们可以在默认值为空时使用用户创建的方法或使用 DefaultIfEmpty 方法来更改默认值。

            int[] pageNumbers = { };
            
            // Setting the default value to 1 after the query.
            int pageNumber1 = pageNumbers.SingleOrDefault();
            if (pageNumber1 == 0)
            {
                pageNumber1 = 1;
            }
            Console.WriteLine("The value of the pageNumber1 variable is {0}", pageNumber1);
            
            // Setting the default value to 1 by using DefaultIfEmpty() in the query.
            int pageNumber2 = pageNumbers.DefaultIfEmpty(1).Single();
            Console.WriteLine("The value of the pageNumber2 variable is {0}", pageNumber2);
            
            /*
             This code produces the following output:
            
             The value of the pageNumber1 variable is 1
             The value of the pageNumber2 variable is 1
            */
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2017-05-29
              • 1970-01-01
              • 2019-12-22
              • 2012-06-30
              • 2011-01-07
              • 1970-01-01
              • 2012-08-01
              • 2023-02-03
              相关资源
              最近更新 更多