OfType <TResult>()中缺乏优化

戴维·克莱姆普夫纳

我一直在寻找的源代码System.Linq.Enumerable.OfType<TResult>()

    public static IEnumerable<TResult> OfType<TResult>(this IEnumerable source) {
        if (source == null) throw Error.ArgumentNull("source");
        return OfTypeIterator<TResult>(source);
    }

    static IEnumerable<TResult> OfTypeIterator<TResult>(IEnumerable source) {
        foreach (object obj in source) {
            if (obj is TResult) yield return (TResult)obj;
        }
    }

如果IEnumerable<TResult> typedSource = source as IEnumerable<TResult>;结果为非null值并且TResult是值类型,则不能有任何null值,因此无需枚举每个值。

您可以将源作为 IEnumerable<TResult>

他们为什么不设计这种方法有什么原因?:

        public static IEnumerable<TResult> OfType<TResult>(this IEnumerable source)
        {
            if (source == null) throw new ArgumentNullException("source");

            IEnumerable<TResult> typedSource = source as IEnumerable<TResult>;
            if (typedSource != null)
            {
                if (typeof(TResult).IsValueType)
                {
                    return typedSource;
                }
            }

            return OfTypeIterator<TResult>(source);
        }

如果源包含大量元素,则只需检查源是否仅包含值类型,就可以节省大量时间。

编辑:

我知道有些新手开发人员尚未了解值/引用类型,也不知道值类型不能null我可以想象这样的情况:新手开发人员将学习OfType<T>()过滤掉null值,并认为它可以在ints列表上使用在这些情况下,优化将使程序员受益(尽管不如了解值/引用类型那么多)。

我从乔恩·斯基特(Jon Skeet)的博客中得到了这个主意

彼得·杜尼奥

只有Microsoft的实现该方法的人员才能确定地告诉您为什么如此执行。然而…

重要的是要注意,提出的替代方案在很多有趣的情况下都行不通。OfType<T>()可能被调用的场景相比,它在什么时候可以工作非常有限

实际上,它在呼叫者不应该首先呼叫的情况下起作用OfType<T>()毕竟,如果对象实际上已经是type IEnumerable<TResult>,则按类型过滤毫无意义调用者应该已经足够了解源的实际类型,以了解是否确实需要这种过滤。而且,他们当然不应该呼吁OfType<T>()消除null价值的副作用

那么,为什么要引入一个“优化”来只优化那些本来就不应该编写的代码呢?这几乎与通常的优化准则背道而驰。第一个规则是关注普通情况。优化不常见情况通常会浪费代码,尤其是在库中,并且在所讨论的不常见情况涉及不良代码时尤其如此

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

F#中的Func <T,TResult>属性

来自分类Dev

将Task <TResult>中的TResult强制转换为System.Object

来自分类Dev

将Task <TResult>中的TResult强制转换为System.Object

来自分类常见问题

C#中Task.FromResult <TResult>的用途是什么

来自分类Dev

如何从MethodInfo创建Action <Tᴺ>或Func <Tᴺ,从TResult>中创建

来自分类Dev

OfType()还是?

来自分类Dev

Func <T,TResult>不是Func <T,TResult>

来自分类Dev

在myBatis中的映射中,ofType和javaType之间有什么区别

来自分类Dev

无法看到 Object 中的所有成员(但使用 `OfType` 我可以访问)

来自分类Dev

OfType <>与“是”查询的性能

来自分类Dev

线程安全的OfType

来自分类Dev

OfType <>与“是”查询的性能

来自分类Dev

对IQueryable OfType <>的思考

来自分类Dev

OfType ForEach排除特定元素

来自分类Dev

Func <T,TResult>访问参数

来自分类Dev

必须指定TResult的通用方法

来自分类Dev

Func <TResult> .BeginInvoke的呼叫签名

来自分类Dev

如何使用pathForResource:ofType:inDirectory访问文件

来自分类Dev

(foreach&isAssignableFrom)与(OfType&foreach)

来自分类Dev

如何告诉“OfType()”忽略继承的类?

来自分类Dev

Task <TResult> .Result vs等待任务

来自分类Dev

C#Func <T,TResult>参数验证

来自分类Dev

使用 Func<T,TResult> c#

来自分类Dev

Java:(缺乏)通用类型转换中的错误

来自分类Dev

Java 8 Lambdas-等效于c#OfType

来自分类Dev

委托,事件处理程序和Controls.OfType

来自分类Dev

OfType瓶坯铸造而不是过滤器

来自分类Dev

具有OfType的foreach不会修改对象属性

来自分类Dev

Cocos3D handleTouch:ofType:无法识别