我在RoutingList中添加了一个新项目,但在第一次删除后,订单错误。
public Dictionary<int, Route> RoutingList = new Dictionary<int, Route>();
例如:
1,路线
2,路线
3,路线
4,路线
5,路线
现在我删除了第一个。
2,路线
3,路线
4,路线
5,路线
通过添加下一个项目,我得到了这个列表:
6,路线
2,路线
3,路线
4,路线
5,路线
在此之后,第一个(6)将被删除。但这是错误的。我想删除第2号。
为什么?
int key = RoutingList.LastOrDefault().Key;
RoutingList.Add(key + 1, tmpRoute);
if (RoutingList.Count == 5)
{
RoutingList.Remove(RoutingList.First().Key);
}
答案 0 :(得分:4)
标准字典的顺序不是默认保持项目顺序。如果您想保留订单并保持快速查询,则需要使用OrderedDictionary。
或者,如果您不需要快速查找,或者您的密钥始终是您的索引(看起来可能是这样),只需查看使用列表,该列表将被订购:
List<Route> routes;
Route route = routes[key];
答案 1 :(得分:1)
您不能依赖字典中的项目顺序。如果你需要删除id最低的条目,那么OrderedDictionary的替代方案就是更改你的查询(我不是100%肯定会编译,因为我现在没有VS可用,但你明白了) :
if (RoutingList.Count == 5)
{
RoutingList.Remove(RoutingList.Keys.Min());
}
答案 2 :(得分:1)
根据MSDN:
Dictionary的容量是Dictionary可容纳的元素数。当元素添加到Dictionary时,通过重新分配内部数组,容量会根据需要自动增加。
这听起来像是ArrayList的行为,其中不维护订单。从字典中删除项目时,内部数组的大小不会减小。因此,索引将在您删除的项目处保持打开状态,直到添加下一个项目进入该空索引。