为了构建堆树,我使用了SortedDictionay并命名为#34; heap"。在第一个节点(Key)上进行一些处理后,我想删除(删除)第一个键,所以我使用" heap.Remove(heap.Keys.First());"。它运行但没有任何变化!这意味着第一个节点仍在那里。
这是课程Task
:
public class Task : IComparable<Task>
{
public int d_ij = 0;
public List<slice> slices = new List<slice>();
public class slice
{
public int slice_id = 0;
public float start = 0;
public float end = 0;
public float speed = 0;
}
#region IComparable<Task> Members
public int CompareTo(Task other)
{
if (this.slices[0].start > other.slices[0].start) return 1;
else return -1;
}
#endregion
}
这是主要功能(在Program.cs类中)
static void Main(string[] args)
{
int Sid = 1;
int Preid = 0;
string LINE = "";
string[] tmp_line;
string[] tmp_tmp_line;
SortedDictionary<Task, float> heap = new SortedDictionary<Task, float>();
Stream Tsk_info;
Tsk_info = File.OpenRead(@"F:\...\info.txt");
StreamReader TSK_INF = new StreamReader(Tsk_info);
while (TSK_INF.EndOfStream == false)
{
LINE = TSK_INF.ReadLine();
tmp_line = LINE.Split(' ');
Task newtask = new Task();
newtask.d_ij = Int16.Parse(tmp_line[0]);
while (Sid < (tmp_line.Length)/2)
{
tmp_tmp_line = tmp_line[2 * Sid].Split('(', ')', ',');
newtask.slices.Add(new Task.slice()
{
slice_id = Sid,
start = float.Parse(tmp_tmp_line[1]),
end = float.Parse(tmp_tmp_line[2]),
speed = float.Parse(tmp_line[Sid + Preid])
});
Preid = Sid;
Sid++;
}
Sid = 1;
Preid = 0;
heap.Add(newtask, newtask.slices[0].start);
}
///////THE PROBLEM IS HERE I CANNOT REMOVE FROM MY SORTED DICTIONARY
bool u = heap.Remove(heap.First().Key);
}
答案 0 :(得分:3)
IComparable<T>.CompareTo()
的实现只返回1和-1,永远不会为0,即使将任务与自身进行比较,因此字典无法删除任何项目,因为它永远不能找到与您要删除的项目匹配的项目(即CompareTo(itemToRemove)
返回0)。
编辑CompareTo()
的实现,以便在项目相同时返回0可以解决问题。
您还应该仔细注意MSDN上关于SortedDictionary<TKey, TValue>
类的以下注释:
只要将键用作SortedDictionary中的键,键必须是不可变的。 SortedDictionary中的每个键都必须是唯一的。键不能为null,但如果值类型TValue是引用类型,则值可以是。
您的Task
课程目前不可变,在slices
列表的开头添加项目,或更改第一项start
字段可能会导致问题。您似乎没有在给出的代码中执行此操作(尽管您可能在其他地方执行此操作),但通过使Task
和slice
不可变,以编程方式防止它发生仍然会更好。