C# 字典列出插入顺序
将词典转换为列表时,列表的顺序是否与项在词典中的插入顺序相关。在本例中,保留了插入顺序,但是否始终如此?或者是词典决定如何存储其条目C# 字典列出插入顺序,c#,dictionary,C#,Dictionary,将词典转换为列表时,列表的顺序是否与项在词典中的插入顺序相关。在本例中,保留了插入顺序,但是否始终如此?或者是词典决定如何存储其条目 Dictionary<string, int> test = new Dictionary<string, int> { {"A",0}, {"Z",1}, {"F",2}, {"J",3} }; List<KeyVal
Dictionary<string, int> test = new Dictionary<string, int>
{
{"A",0},
{"Z",1},
{"F",2},
{"J",3}
};
List<KeyValuePair<string, int>> testlist =
new List<KeyValuePair<string,int>>(test);
标准字典通常保留插入顺序,但这可能无法保证,您不应该依赖它
发件人:
出于枚举的目的,字典中的每个项都被视为表示值及其键的KeyValuePair结构。返回项目的顺序未定义
不,它不能维持秩序。如果是这样的话,那只是偶然和内部实现细节。不能保证元素的枚举顺序与插入顺序相同。 文件: 返回项目的顺序未定义
字典不保证项目的顺序
如果您想维护添加到其中的订单项目,则需要。唯一确定这一点的方法是查看代码,所以让我们这样做吧 反编译时,您正在调用的List构造函数的实现如下所示
public List(IEnumerable<T> collection)
{
if (collection == null)
ThrowHelper.ThrowArgumentNullException(ExceptionArgument.collection);
ICollection<T> collection1 = collection as ICollection<T>;
if (collection1 != null)
{
int count = collection1.Count;
if (count == 0)
{
this._items = List<T>._emptyArray;
}
else
{
this._items = new T[count];
collection1.CopyTo(this._items, 0);
this._size = count;
}
}
else
{
this._size = 0;
this._items = List<T>._emptyArray;
foreach (T obj in collection)
this.Add(obj);
}
}
通过查看代码,字典的内部项被编入索引
基于这些发现,如果你想问的是,当我的字典转换成通用列表时,它的顺序会被保留吗然后是的,它将是根据.NET 4.0,这是我正在寻找的版本。然而,问题是你不能保证你的条目从一开始就被添加到字典中的顺序。因此,我的建议是,在转换之前,切换到使用OrderedDictionary或应用OrderBy子句
var list = new List<KeyValuePair<K, V>>(test.OrderBy(x => x.Value));
也许会有帮助:为什么这么多人投了反对票?或者你们是想暗示,与未记录、易于更改和意外实施细节相关是值得鼓励的吗?@MagnusHoff我回答这个问题的方式是,当我根据字典创建一个新列表时,我的项目是否会按相同的顺序排列,所以我的答案就是基于这个顺序。我会更新澄清。阿兹。是的,很公平,我将为此添加一个免责声明。我认为,如果它确实保留了顺序,那么通常只是巧合,看一下插入,它使用密钥的哈希代码来计算它的顺序。它经常这样做,但无论如何都不应该依赖它。
var list = new List<KeyValuePair<K, V>>(test.OrderBy(x => x.Value));