我怎樣才能達到
// myList is a List<T>
myList = myList.GetRange(offset, number);
作為就地宣告?(即在此程序中不創建新串列)
uj5u.com熱心網友回復:
無需創建新串列
如何列舉 LINQ Skip/Take 的結果:
myList.Skip(offset).Take(number);
如果您希望對串列進行永久更改:
myList.RemoveRange(offset number, myList.Count - (offset number));
myList.RemoveRange(0, offset);
您可能會發現創建新串列比從現有串列中洗掉更快;如果您出于性能原因這樣做,請務必與馬匹比賽
uj5u.com熱心網友回復:
由于 List 處理其內部陣列的方式,這不太可能。另一個“問題”是新串列會有添加、洗掉等。這些會如何影響原始串列?
取決于如何使用這個新的“切片”......也許 IReadOnlyList 外觀會合適?注入串列、偏移量、數字。實作使用 args 偏移到內部 List 索引器中的方法......(對范圍的保護大于 List.Count 等)您需要實作一個具有相同偏移量的列舉器,但這很容易yield
uj5u.com熱心網友回復:
或者...
CollectionsMarshal.AsSpan(myList).Slice(offset, number);
會給你一個跨越內部陣列的跨度。它有一個列舉器、索引器、計數。
仍然需要注意offset range不要大于Capacity。如果串列的容量更改為與跨度相交,它會變得“棘手”。由于 List 將創建一個新陣列,但您的跨度仍將超過舊的。
另一個“小心你想要的”情況:)
uj5u.com熱心網友回復:
一種更簡單的就地更新串列的方法:
myList.RemoveRange(0, offset); // Remove items at the beginning
myList.RemoveRange(count, myList.Count - count); // Remove items at the end
這具有O(n)復雜性,其中n= myList.Count - count。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/371014.html
上一篇:物體框架可以在不訪問sp_executesql的情況下執行存盤程序嗎?
下一篇:計算BST中小于X的元素數
