我想要反轉一個枚舉,但是代碼審查沒過,這是為什麼
在 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 反轉之前,請先想一下上面的代碼。特别是在做庫的時候,小夥伴會傳入的值會挖坑,是以我推薦反轉需要知道這是有限數組