osc*_*kuo 54
你可以做点什么
myStrings.DefaultIfEmpty("myDefaultString").Single()
Run Code Online (Sandbox Code Playgroud)
看看这里
Joe*_*ite 24
?? 运营商.如果left参数为null,则计算并返回第二个参数.
myCollection.SingleOrDefault() ?? new[]{new Item(...)}
Run Code Online (Sandbox Code Playgroud)
这只适用于引用类型(或nullables),但它可以非常简单地完成您正在寻找的内容.
你可以自己动手.
public static T SingleOrDefault<T>(this IEnumerable<T> enumerable, T defaultValue) {
if ( 1 != enumerable.Count() ) {
return defaultValue;
}
return enumerable.Single();
}
Run Code Online (Sandbox Code Playgroud)
这可能有点贵,因为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();
}
Run Code Online (Sandbox Code Playgroud)