Единственный способ узнать это наверняка, это посмотреть на код, так что давайте сделаем это ...
Реализация конструктора вы звоните из List<T>
, когда декомпилируемой, выглядит как
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);
}
}
Как вы можете видеть, словарь отливают ICollection<T>
, а затем CopyTo
называется на ней, что приводит нас к Dictionary<TKey, TValue>
private void CopyTo(KeyValuePair<TKey, TValue>[] array, int index)
{
if (array == null)
ThrowHelper.ThrowArgumentNullException(ExceptionArgument.array);
if (index < 0 || index > array.Length)
ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument.index, ExceptionResource.ArgumentOutOfRange_NeedNonNegNum);
if (array.Length - index < this.Count)
ThrowHelper.ThrowArgumentException(ExceptionResource.Arg_ArrayPlusOffTooSmall);
int num = this.count;
Dictionary<TKey, TValue>.Entry[] entryArray = this.entries;
for (int index1 = 0; index1 < num; ++index1)
{
if (entryArray[index1].hashCode >= 0)
array[index++] = new KeyValuePair<TKey, TValue>(entryArray[index1].key, entryArray[index1].value);
}
}
С точки зрения кода внутренние элементы словаря индексируются в.
Основываясь на этих выводах, если вы спрашиваете, «будет ли порядок моего словаря сохранен при его преобразовании в общий список?» - тогда да, это будет (как .NET 4.0, версия которого я смотрю). Однако проблема заключается в том, что вы фактически не можете гарантировать, что ваш товар будет добавлен в словарь . Поэтому мой совет переключился на использование чего-то вроде OrderedDictionary<T>
или применил бы предложение OrderBy
, прежде чем преобразовать его, например.
var list = new List<KeyValuePair<K, V>>(test.OrderBy(x => x.Value));
Может быть полезно: http://stackoverflow.com/questions/7387874/is-there-a-an-easier-way-to-initialize-a-listkeyvaluepairt-u-like-a-dictio – Habib