SingleOrDefault:如何更改默认值?

zsh*_*arp 34 linq

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

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),但它可以非常简单地完成您正在寻找的内容.

  • 当我开始使用零合并时,我的脑海里响起了一阵掌声.+1 (3认同)

Jar*_*Par 5

你可以自己动手.

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)