.NET 中的异步排序(使用任务)
Async Sorting (using Tasks) in .NET
我正在构建一个解释器,需要在我的标准库中创建一个函数来根据用户定义的比较器进行排序。这个比较器必须是异步的,所以这需要一个排序函数本身是异步的(使用 Task
s)。
是否存在允许比较器中的任务的现有 .NET 排序函数?即比较器returns一个Task<int>
,排序函数完成Task
,使用int
进行排序
例如,List.Sort(IComparer<T>
) function where Compare(T,T)
的一个版本返回了 Task<int>
而不是 int
。
(我正在使用 F#,但很乐意使用 C# 库)
编辑:假设比较器需要制作 HTTP POST 来比较两个项目。
您可以实现异步 mergesort 实现来做到这一点。
事实上,Mergesort 上的维基百科文章实际上讨论了并行实现。
基本算法本身很简单:
- 从要排序的项目列表开始
- 如果它的长度是 0 或 1,你就大功告成了:它们已经按定义排序了。
- 将列表分成两半
- 对每一半进行递归归并排序,然后
- 将它们合并在一起。
如果您的列表是链表,则不需要额外的内存,因为 next
点提供了所需的一切。
如果您的列表是一个类似数组的构造,那么您必须消耗额外的内存来为每一半创建工作数组,因为就地合并不是很实用。
编辑说明:这是 Microsoft 的一篇关于实现具有多个分区(而不仅仅是 2 个)的 .Net 并行合并排序的小论文:https://devblogs.microsoft.com/pfxteam/parallel-merge-sort-using-barrier/
我正在构建一个解释器,需要在我的标准库中创建一个函数来根据用户定义的比较器进行排序。这个比较器必须是异步的,所以这需要一个排序函数本身是异步的(使用 Task
s)。
是否存在允许比较器中的任务的现有 .NET 排序函数?即比较器returns一个Task<int>
,排序函数完成Task
,使用int
进行排序
例如,List.Sort(IComparer<T>
) function where Compare(T,T)
的一个版本返回了 Task<int>
而不是 int
。
(我正在使用 F#,但很乐意使用 C# 库)
编辑:假设比较器需要制作 HTTP POST 来比较两个项目。
您可以实现异步 mergesort 实现来做到这一点。
事实上,Mergesort 上的维基百科文章实际上讨论了并行实现。
基本算法本身很简单:
- 从要排序的项目列表开始
- 如果它的长度是 0 或 1,你就大功告成了:它们已经按定义排序了。
- 将列表分成两半
- 对每一半进行递归归并排序,然后
- 将它们合并在一起。
如果您的列表是链表,则不需要额外的内存,因为 next
点提供了所需的一切。
如果您的列表是一个类似数组的构造,那么您必须消耗额外的内存来为每一半创建工作数组,因为就地合并不是很实用。
编辑说明:这是 Microsoft 的一篇关于实现具有多个分区(而不仅仅是 2 个)的 .Net 并行合并排序的小论文:https://devblogs.microsoft.com/pfxteam/parallel-merge-sort-using-barrier/