0

我已经问过一个类似的问题,除了它是一个列表,但是这里的一个成员建议我使用字典,所以我决定这样做。这是原始链接。

将值添加到队列列表中的特定位置

因此,我正在尝试将新进程添加到字典中的特定位置。

rr_dict[Int32.Parse(priority_add_textbox.Text)].Add(new process {
      Proc_Id = sjf_queue.Size + 1,
      Proc_BurstTime = Int32.Parse(time_add_texbox.Text),
      Proc_Priority = Int32.Parse(priority_add_textbox.Text)
});

发生这种情况时,我收到一个错误:

mscorlib.dll 中出现“System.Collections.Generic.KeyNotFoundException”类型的未处理异常

附加信息:字典中不存在给定的键。

有谁知道我需要做什么?

4

3 回答 3

3

rr_dict[Int32.Parse(priority_add_textbox.Text)]您在添加之前尝试访问。

字典没有排序,因此您尝试使用rr_dict它,就好像它被定义为Dictionary<int, List<process>>并且正在向 key 持有的列表中添加一个新进程Int32.Parse(priority_add_textbox.Text)

与此相比,我不确定您要做什么。

在添加到字典之前,您可能需要以下内容:

var index = Int32.Parse(priority_add_textbox.Text);
if (!rr_dict.ContainsKey(index))
{
    rr_dict[index] = new List<process>();
}
...
于 2013-10-10T20:30:44.183 回答
2

普通Dictionary是无序的。它的每个条目都作为键值对返回,其顺序未定义。

如果您想要一个同时考虑订单的字典,请使用OrderedDictionary.

使用您当前的代码,您将尝试访问一个关键条目,而不是添加给定的条目(这是您想要做的)。

于 2013-10-10T20:29:57.270 回答
0

您得到的错误是由Item字典的属性引起的。您正在尝试访问字典中的特定位置(即 的结果Int32.Parse(priority_add_textbox.Text))。如果不存在,则必须先创建它。像这样的东西:

rr_dict[Int32.Parse(priority_add_textbox.Text)] = new Queue<process>();
于 2013-10-10T20:32:24.140 回答