使用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时,没有找到匹配?
因为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
*/