gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 17:14:15 29 4
gpt4 key购买 nike

我有以下代码

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/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com