Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 字典列出插入顺序_C#_Dictionary - Fatal编程技术网

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));