使用SingleOrDefault()时的默认值

时间:2014-08-05 19:48:39

标签: c# .net linq

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

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?

5 个答案:

答案 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;