我需要將現有列表克隆到另一個現有列表中。由於環境需要非常高的性能,我需要消除不必要的內存重新分配。將列表克隆到現有列表中的最有效方法是最小化內存重新分配?
我能想到的最有效的算法如下,它會增加目的地列表的容量,以便根據需要匹配源列表,但不會減少它自己的數量。 (這是該項目的可接受行爲。)
public static void CloneInto(this List<T> source, List<T> destination)
{
if (destination.Capacity < source.Capacity)
{
/* Increase capacity in destination */
destination.Capacity = source.Capacity;
}
/* Direct copy of items within the limit of both counts */
for (var i = 0; i < source.Count && i < destination.Count; i++)
{
destination[i] = source[i];
}
if (source.Count > destination.Count)
{
/* Append any extra items from source */
for (var i = destination.Count; i < source.Count; i++)
{
destination.Add(source[i]);
}
}
else if (source.Count < destination.Count)
{
/* Trim off any extra items from destination */
while (destination.Count > source.Count)
{
destination.RemoveAt(destination.Count - 1);
}
}
}
但是,這似乎有很多代碼,邏輯和循環。
是否有一種更有效的方法將列表克隆到現有列表中,同時避免不必要的內存分配?
您是否在環境中測試過a.Concat(b)? –
我不知道.Concat()會如何適應這個?當源有更多的項目,我想我可以.Concat()尾部作爲destination.Concat(source.Skip(destination.Count)) - 是你的意思? –
這似乎是功能簽名中的錯誤設計。你確定這是強制性的嗎?例如,將'destination.Capacity'設置爲比當前值更大的值會導致重新分配和複製列表(帶有不需要的,立即被覆蓋的值)。如果簽名會返回目的地列表,您可以簡單地創建一個副本,並在容量不夠大時返回該副本。 – Amit