c# - List<T> 转换算法和性能注意事项

标签 c# performance casting generic-list

我有以下代码

class Program
    {
        static void Main(string[] args)
        {
            List<A> aList = new List<A>();

            var aObj = new A();

            aObj.Go(aList.Cast<IB>());
        }
    }

    class A : IB
    {
        public void Go(IEnumerable<IB> interfaceList)
        {
            foreach (IB ibby in interfaceList)
            {
                Console.WriteLine("Here");
            }
        }
    }

    interface IB
    {
        void Go(IEnumerable<IB> interfaceList);
    }

我最初尝试传递一个列表,但是 doesn't work . 经过SO的大量帮助我发现传递 IEnumerable 是将对象作为 .ofType(IB) 传递的唯一方法。

不幸的是,在我的代码中,以下行将被执行数千次:

aList.Cast<IB>();

我想知道是否有人知道它是如何通过算法(在 IL 中)实现的以及它的时间顺序是什么。

也就是说,它是否比仅强制转换每个项目的 foreach 循环更快,或者它确实是这样做的?

编辑 主类需要维护实际对象的列表。但读者只能通过界面接触它们。

最佳答案

您应该将 Go 更改为:

public void Go<T>(IEnumerable<T> interfaceList)
    where T : IB
{
    foreach (IB ibby in interfaceList)
    {
        Console.WriteLine("Here");
    }
}

然后你就可以了,不需要调用 Cast。我怀疑 Cast 的源代码实现非常简单,尽管我相信它在 3.5 和 3.5SP1 之间发生了变化。但是,它可能需要以正常的迭代器 block 方式设置新的状态机等。如果可能,最好避免它。

即使新方法是通用的,类型推断通常也会为您处理好它,因此您无需显式指定 T

关于c# - List<T> 转换算法和性能注意事项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/606902/

相关文章:

c# - 如何将绑定(bind)标记扩展从内联语法转换为元素语法?

iphone - 在 Objective-C 中比较 float 的奇怪问题

c# - 使用 T 从 Dictionary<string, object> 转换值

c# - RFID RC522 Raspberry PI 2 Windows 物联网

c# - CodedUI [测试方法] 与 [CodedUITest]

iOS Core Data - 获取一个实体对象是否会自动从关系实体中获取所有对象?

mysql - 哪个更快 : a lookup on a large denormalized table or a join between three smaller tables?

sql - 使用函数的 SQL Server 查询速度非常慢

java - 自动浇注

c# - 使用Xamarin表单选择产品时如何显示产品详细信息