【问题标题】:How to remove a key from SortedDictionary如何从 SortedDictionary 中删除键
【发布时间】:2014-04-10 18:38:24
【问题描述】:

为了构建一个堆树,我使用了 SortedDictionay 并将其命名为“堆”。在第一个节点(键)上进行一些处理后,我想删除(删除)第一个键,所以我使用“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);
}

【问题讨论】:

  • Remove 返回什么?根据您的描述,这听起来应该可行 - 您可以发布您的代码吗?
  • 它只是运行并继续......当我在“heap.remove(...)”之后检查时,堆仍然和以前一样......
  • 为什么把我的代码放在这里这么难……每次都变得乱七八糟,没有足够的空间……
  • 顺便说一句,删除返回 false!请帮助我..我坚持了很长时间..没有结果!
  • 您可能需要为排序字典实现IEquatable 以比较两个对象是否相等。

标签: c# sorting dictionary


【解决方案1】:

IComparable&lt;T&gt;.CompareTo() 的实现只返回 1 和 -1,从不返回 0,即使在将 Task 与自身进行比较时,字典也无法删除任何项目,因为它永远无法找到匹配的项目您尝试删除的项目(即 CompareTo(itemToRemove) 返回 0)。

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

您还应该注意 MSDN 上关于SortedDictionary&lt;TKey, TValue&gt; 类的以下注释:

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

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

【讨论】:

    猜你喜欢
    • 2016-04-01
    • 2011-06-10
    • 2011-09-30
    • 1970-01-01
    • 2014-11-19
    • 1970-01-01
    • 2011-10-29
    • 2012-07-01
    • 2017-06-03
    相关资源
    最近更新 更多