我想要反转一个枚举,但是代码审查没过,这是为什么

在 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://blog.lindexi.com/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 ,以避免陈旧错误知识的误导,同时有更好的阅读体验。

如果你想持续阅读我的最新博客,请点击 RSS 订阅,推荐使用RSS Stalker订阅博客,或者收藏我的博客导航

知识共享许可协议 本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。欢迎转载、使用、重新发布,但务必保留文章署名林德熙(包含链接: https://blog.lindexi.com ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请 与我联系

微软最具价值专家


无盈利,不卖课,做纯粹的技术博客

以下是广告时间

推荐关注 Edi.Wang 的公众号

欢迎进入 Eleven 老师组建的 .NET 社区

以上广告全是友情推广,无盈利