所以,如果我有一个简单的类,如:
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?
答案 0 :(得分:9)
因为Color
是一个类,所以默认值为null。所以你可以像这样使用null-coalescing operator(??
):
Color selected = ColorList.SingleOrDefault(a => a.ID == someVariable) ?? defaultValue;
答案 1 :(得分: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);
答案 2 :(得分:1)
使用?? (null coalescing operator)
Color selected = ColorList.SingleOrDefault(a => a.ID == someVariable) ??
new Color {Id = 1234, ColorName = "Blue"}; //Default value
答案 3 :(得分:1)
您可以尝试使用空合并,因为您无法为引用类型指定默认值:
Color selected = ColorList.SingleOrDefault(a => a.ID == someVariable) ?? DefaultValue;
答案 4 :(得分:0)
不幸的是,SingleOrDefault将返回单个Default(T)值。你能做的最好的就是这样:
Color defaultColor;
var single = ColorList.SingleOrDefault(a => a.ID == someVariable);
single = selected == null ? defaultColor : single;