我想要反转一个枚举,但是代码审查没过,这是为什么
在 C# 里面可以使用 IEnumerable 表示枚举值,而我提供了一个库给小伙伴用,这个库包含了这个方法,需要在某个不知道从哪里来的枚举值进行反转然后处理业务
小伙伴说代码审查没过,原因是在他的设备上一运行就占用了 100G 的内存
我写的代码也很简单
private static void Foo(IEnumerable<int> list)
{
foreach (var temp in list.Reverse())
{
// 业务
}
}
上面的代码有什么坑
虽然反转一个枚举可以使用 Reverse 方法,很方便,但是这个方法需要先将值进行 ToArray 然后再反转
而小伙伴可以通过下面代码写出一个有无限大的数组请看代码
private static IEnumerable<int> WarellereleKeneaberecembe()
{
while (true)
{
yield return 0;
}
}
反转是需要知道这个值的最后一个是什么,按照上面的代码,对于一个有无限大的容量的数组,求最大的元素是哪个,其实就是无限大,刚好无限大在内存是无法表示的,所以就会不断申请内存计算
static void Main(string[] args)
{
foreach (var temp in WarellereleKeneaberecembe().Reverse())
{
}
}
private static IEnumerable<int> WarellereleKeneaberecembe()
{
while (true)
{
yield return 0;
}
}
在想要写出 IEnumerable 反转之前,请先想一下上面的代码。特别是在做库的时候,小伙伴会传入的值会挖坑,所以我推荐反转需要知道这是有限数组
本文会经常更新,请阅读原文: https://dotnet-campus.github.io//post/C-%E4%B8%BA%E4%BB%80%E4%B9%88%E4%B8%8D%E5%BB%BA%E8%AE%AE%E5%AF%B9%E4%BB%BB%E6%84%8F%E7%9A%84-IEnumerable-%E5%8F%8D%E8%BD%AC.html ,以避免陈旧错误知识的误导,同时有更好的阅读体验。
本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。欢迎转载、使用、重新发布,但务必保留文章署名 lindexi (包含链接: https://dotnet-campus.github.io/ ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请 与我联系 。