使用SingleOrDefault()时的默认值

本文关键字:默认值 SingleOrDefault 使用 | 更新日期: 2023-09-27 18:16:27

那么,如果我有一个简单的类,比如:

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时,没有找到匹配?

使用SingleOrDefault()时的默认值

因为Color是一个类,所以默认值为空。因此,您可以像这样使用空合并运算符(??):

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

SingleOrDefault仅在未找到匹配实例时返回type的默认值。在本例中,它将是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);

使用??(空合并操作符)

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

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

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

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

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

当默认值为空时,可以使用用户创建的方法或使用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
*/