【问题标题】:How to provide comparison and assignment operators for sorting procedure如何为排序过程提供比较和赋值运算符
【发布时间】:2015-04-28 12:47:25
【问题描述】:

我必须使用这种结构的数组

internal sealed class Task
{
    ...
    public String Id { get; private set; }
    public String Name { get; private set; }
    public UInt32 Time { get; private set; }
}
...
    private List<Task> _tasks;
    private List<Boolean[]> _tasksAllowedProcessingUnits;

这个数组是一一对应的。我需要对数组_tasks 进行排序,但是在交换数组_tasks 中的元素时,我还需要交换_tasksAllowedProcessingUnits 中的元素。因此,必须保留一对一的对应关系。

出于某些性能原因,我不想将所有与任务相关的数据放在一个结构中以将其存储在单个数组中。

【问题讨论】:

  • 为什么不使用KeyValuePair 来存储这些映射?
  • @YuvalItzchakov ,谢谢你的建议,我马上试试。
  • 我不明白,你为什么需要分配排序?同样在 c# 中,您通常不实现运算符,而是实现相关接口或提供比较器。

标签: c# sorting assignment-operator comparison-operators


【解决方案1】:

没有任何预先完成的事情。显然有多种解决方案

A) 您找到了 QuickSort 实现的源代码,然后使用该代码“手动”执行排序 + 排序

B) 您创建一个引用 TaskBoolean[] 的覆盖对象,并对其集合进行排序。

List<Tuple<Task, Boolean[]>> lst = Enumerable.Range(0, _tasks.Count).Select(ix => Tuple.Create(_tasks[ix], _tasksAllowedProcessingUnits[ix])).ToList();
lst.Sort((p, q) => p.Item1.CompareTo(q.Item1));

for (int i = 0; i < _tasks.Count; i++) {
    _tasks[i] = lst[i].Item1;
    _tasksAllowedProcessingUnits[i] = lst[i].Item2
}

(请注意,.NET Task 对象是不可比较的,所以我希望你有一个专门的比较器)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-08
    • 1970-01-01
    • 1970-01-01
    • 2011-11-16
    • 1970-01-01
    • 2013-01-23
    • 2023-04-08
    • 1970-01-01
    相关资源
    最近更新 更多