如何将CommunityToolkit.HighPerformance的Memory2D<T>转为一维集合?
Memory2D转一维集合的实现方案
你的方法MyMemory2D.ToArray().AsSpan().ToArray()是可行的,但完全没必要多做后面的AsSpan().ToArray()——MyMemory2D.ToArray()本身就直接返回了一维数组,额外的两步属于冗余操作,只会浪费内存和性能。
下面是几种更快更优的实现方式:
直接获取一维数组:直接调用
Memory2D<T>自带的ToArray()方法即可,这是官方优化过的实现,内部会高效复制内存,是性能最好的方式:T[] array = MyMemory2D.ToArray();转换为List
的高效方式 :如果需要转成List<T>,没必要先转数组再初始化List,可以直接利用Span<T>来减少一次内存分配:Span<T> span = MyMemory2D.AsSpan(); List<T> list = new List<T>(span.Length); list.AddRange(span);自定义顺序的手动复制:如果需要按非默认顺序(比如列优先而非默认的行优先)生成一维集合,可以手动遍历并复制,性能和官方实现接近,但灵活性更高:
T[] result = new T[MyMemory2D.Length]; Span<T> destSpan = result.AsSpan(); int offset = 0; // 列优先示例 for (int col = 0; col < MyMemory2D.Width; col++) { var column = MyMemory2D.GetColumn(col); column.CopyTo(destSpan.Slice(offset)); offset += column.Length; }
内容的提问来源于stack exchange,提问作者nuclear sweet
相关产品推荐
相关产品推荐

