如何从SortedDictionary中删除一个键

时间:2014-04-10 18:38:24

标签: c# sorting dictionary

为了构建堆树,我使用了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);
}

1 个答案:

答案 0 :(得分:3)

IComparable<T>.CompareTo()的实现只返回1和-1,永远不会为0,即使将任务与自身进行比较,因此字典无法删除任何项目,因为它永远不能找到与您要删除的项目匹配的项目(即CompareTo(itemToRemove)返回0)。

编辑CompareTo()的实现,以便在项目相同时返回0可以解决问题。

您还应该仔细注意MSDN上关于SortedDictionary<TKey, TValue>类的以下注释:

  

只要将键用作SortedDictionary中的键,键必须是不可变的。 SortedDictionary中的每个键都必须是唯一的。键不能为null,但如果值类型TValue是引用类型,则值可以是。

您的Task课程目前不可变,在slices列表的开头添加项目,或更改第一项start字段可能会导致问题。您似乎没有在给出的代码中执行此操作(尽管您可能在其他地方执行此操作),但通过使Taskslice不可变,以编程方式防止它发生仍然会更好。