String和Enumerable.Count

时间:2016-01-22 10:03:51

标签: c# .net string

Enumerable.Count的文档中,我们看到如果源实现ICollection<T>

,则会处理特殊情况
  

如果源的类型实现ICollection,则该实现用于获取元素的数量。否则,此方法确定计数。

这在implementation中可见:

public static int Count<TSource>(this IEnumerable<TSource> source) {
    if (source == null) throw Error.ArgumentNull("source");
    ICollection<TSource> collectionoft = source as ICollection<TSource>;
    if (collectionoft != null) return collectionoft.Count;
    ICollection collection = source as ICollection;
    if (collection != null) return collection.Count;
    int count = 0;
    using (IEnumerator<TSource> e = source.GetEnumerator()) {
        checked {
            while (e.MoveNext()) count++;
        }
    }
    return count;
}

现在,让我们看一下stringString类具有以下签名:

public sealed class String : IComparable, ICloneable, IConvertible, IEnumerable, IComparable<string>, IEnumerable<char>, IEquatable<string>

我们在这里可以看到它没有实现ICollection,因为它是不可变的。

因此,Enumerable.Count上的string调用将每次迭代整个字符串,即使它是不可变的。

所以我的问题是,为什么ICollection有特殊情况,String却没有。

1 个答案:

答案 0 :(得分:2)

这只会得到基于意见的答案,但我怀疑人们不经常在字符串上使用.Count()

此外,您支持的每种其他类型都会减慢没有特定实现的类型的Count。

因此,尽管实现完全可以将字符串考虑在内,但我怀疑设计师选择它并不值得。