SingleOrDefault返回null,但如果我想分配值来表示未找到的对象,该怎么办?
答案 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;
}
}