diff --git a/Recyclable.Collections/RecyclableList.cs b/Recyclable.Collections/RecyclableList.cs index fc4e9b4..eb7a97c 100644 --- a/Recyclable.Collections/RecyclableList.cs +++ b/Recyclable.Collections/RecyclableList.cs @@ -83,6 +83,7 @@ namespace Recyclable.Collections var sourceBlockCount = source?.Length ?? 0; int requiredBlockCount = (int)(newCapacity / blockSize) + (newCapacity % blockSize > 0 ? 1 : 0); + Span sourceSpan; Span newArraySpan; T[][] newMemoryBlocks = requiredBlockCount >= RecyclableDefaults.MinPooledArrayLength ? arrayPool.Rent(requiredBlockCount) @@ -94,15 +95,15 @@ namespace Recyclable.Collections switch (sourceBlockCount > 0) { case true: - Memory sourceMemory = new(source); - Memory newArrayMemory = new(newMemoryBlocks); - sourceMemory.CopyTo(newArrayMemory); - if (sourceMemory.Length >= RecyclableDefaults.MinPooledArrayLength) + sourceSpan = new Span(source); + newArraySpan = new Span(newMemoryBlocks); + sourceSpan.CopyTo(newArraySpan); + if (sourceSpan.Length >= RecyclableDefaults.MinPooledArrayLength) { arrayPool.Return(source!); } - newArraySpan = new Span(newMemoryBlocks)[sourceBlockCount..]; + newArraySpan = newArraySpan[sourceBlockCount..]; break; case false: @@ -151,7 +152,7 @@ namespace Recyclable.Collections return newMemoryBlocks; case false: - var sourceSpan = new Span(source)[..requiredBlockCount]; + sourceSpan = new Span(source)[..requiredBlockCount]; newArraySpan = new Span(newMemoryBlocks); sourceSpan.CopyTo(newArraySpan); sourceSpan = new Span(source)[newArraySpan.Length..];