SingleOrDefault:如何更改默认值?

时间:2009-05-04 02:54:17

标签: linq

SingleOrDefault返回null,但如果我想分配值来表示未找到的对象,该怎么办?

4 个答案:

答案 0 :(得分:53)

你可以做点什么

myStrings.DefaultIfEmpty("myDefaultString").Single()

结帐here

答案 1 :(得分:24)

?? operator。如果left参数为null,则计算并返回第二个参数。

myCollection.SingleOrDefault() ?? new[]{new Item(...)}

这只适用于引用类型(或nullables),但它可以非常简单地完成你想要的工作。

答案 2 :(得分:5)

你可以自己动手。

public static T SingleOrDefault<T>(this IEnumerable<T> enumerable, T defaultValue) {
  if ( 1 != enumerable.Count() ) {
    return defaultValue;
  }
  return enumerable.Single();
}

这可能有点贵,因为Count()要求您处理整个集合,并且运行起来相当昂贵。最好是调用Single,捕获InvalidOperationException或滚动IsSingle方法

public static bool IsSingle<T>(this IEnumerable<T> enumerable) {
  using ( var e = enumerable.GetEnumerator() ) {
    return e.MoveNext() && !e.MoveNext();
  }
}

public static T SingleOrDefault<T>(this IEnumerable<T> enumerable, T defaultValue) {
  if ( !enumerable.IsSingle() ) {
    if( enumerable.IsEmpty() ) { 
      return defaultValue;
    }
    throw new InvalidOperationException("More than one element");
  }
  return enumerable.Single();
}

答案 3 :(得分:0)

您可以创建自己的扩展方法 - SingleOrNew。

public static class IEnumerableExtensions
{
    public static T SingleOrNew<T>( this IEnumerable<T> enumeration, T newValue )
    {
        T elem = enumeration.SingleOrDefault();
        if (elem == null)
        {
            return newValue;
        }
        return elem;
    }

    public static T SingleOrNew<T>( this IEnumerable<T> enumeration, Func<T,bool> predicate, T newValue )
    {
        T elem = enumeration.SingleOrDefault( predicate );
        if (elem == null)
        {
            return newValue;
        }
        return elem;
    }
}