Linq-Single&&First
public static TSource Single(this IEnumerable source) { if (source == null) throw Error.ArgumentNull("source"); IList list = source as IList ; if (list != null) { switch (list.Count) { case 0: throw Error.NoElements(); case 1: return list[0]; } } else { using (IEnumerator e = source.GetEnumerator()) { if (!e.MoveNext()) throw Error.NoElements(); TSource result = e.Current; if (!e.MoveNext()) return result; } } throw Error.MoreThanOneElement(); }
有委托版本的:
public static TSource Single(this IEnumerable source, Func bool> predicate) { if (source == null) throw Error.ArgumentNull("source"); if (predicate == null) throw Error.ArgumentNull("predicate"); TSource result = default(TSource); long count = 0; foreach (TSource element in source) { if (predicate(element)) { result = element; checked { count++; } } } switch (count) { case 0: throw Error.NoMatch(); case 1: return result; } throw Error.MoreThanOneMatch(); }
再看下
public static TSource First(this IEnumerable source, Func bool> predicate) { if (source == null) throw Error.ArgumentNull("source"); if (predicate == null) throw Error.ArgumentNull("predicate"); foreach (TSource element in source) { if (predicate(element)) return element; } throw Error.NoMatch(); }
实际比较了下性能
从上面的实验数据来看,应该是使用First()性能高,但也不能绝对这样说,如果是使用数据库,那会使用数据库索引。不见得比First()方法慢。
而且时间上差距也不是很大,从字面意义上来说返回一条应该single,不然微软也不会再加这个方法进来。