C#如何在不产生任何垃圾的情况下对列表进行排序(Unity3d)

C#如何在不产生任何垃圾的情况下对列表进行排序(Unity3d),c#,algorithm,sorting,unity3d,C#,Algorithm,Sorting,Unity3d,List.Sort使用的方法最终使用Array.Sort,即使您将实例传递给IComparer,它也会生成2字节的垃圾。我需要对Unity3d中的每一帧中的许多列表进行排序,因此我需要一种算法,如果可能的话,它不会创建一个字节的垃圾。临时变量的堆栈分配应该可以 if(比较器==null) comparer=(IComparer)comparer.Default; if(二进制兼容性.TargetsAtLeast_桌面_V4_5) 内省排序(键、索引、长度、比较器); 其他的 ArraySort

List.Sort使用的方法最终使用Array.Sort,即使您将实例传递给IComparer,它也会生成2字节的垃圾。我需要对Unity3d中的每一帧中的许多列表进行排序,因此我需要一种算法,如果可能的话,它不会创建一个字节的垃圾。临时变量的堆栈分配应该可以

if(比较器==null)
comparer=(IComparer)comparer.Default;
if(二进制兼容性.TargetsAtLeast_桌面_V4_5)
内省排序(键、索引、长度、比较器);
其他的
ArraySortHelper.DepthLimitedQuickSort(键,索引,长度+索引-1,比较器,32);

在此github中查看此库。我在底部找到了这个关于LINQ是如何影响GC的,以及在每个帧上使用哪个LINQ函数是安全的。这个图书馆是专门为统一而写的,正如作者所说,这个图书馆是

C#的IEnumerator和LINQ的无GC版本

有一种实现快速排序算法且不产生垃圾的排序方法。
老实说,我还没有对它进行全面测试,但正如我使用过的那样,它工作得很好。

你确定
Array.Sort
分配了吗?你能确定分配的是什么吗?我可能不是垃圾。对于错误检查,网络库向对象添加类型。如果您解释为什么要在更新函数中对许多列表进行排序,效果会更好。也许,这里的人可以向你推荐一种更好的方法。至少,根据Unity profiler,它说每当调用sort时,它都会分配2个字节。排序是我的VR框架的一个要求,这是不可避免的。呃,你不能在.NET中分配一个2字节的对象——最小对象大小是12字节。所以你看到的不是对象分配。我怀疑你误解了探查器告诉你的内容,不管是什么,汉克斯,请看一看!
if (comparer == null)
    comparer = (IComparer<T>)Comparer<T>.Default;
if (BinaryCompatibility.TargetsAtLeast_Desktop_V4_5)
    ArraySortHelper<T>.IntrospectiveSort(keys, index, length, comparer);
else
    ArraySortHelper<T>.DepthLimitedQuickSort(keys, index, length + index - 1, comparer, 32);