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, Funcbool> 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, Funcbool> 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,不然微软也不会再加这个方法进来。