Каков порядок Dictionary.Values.ToArray ()? - PullRequest
10 голосов
/ 28 мая 2011

Если я добавляю значения в словарь, а затем где-нибудь в коде, я хочу преобразовать этот словарь в массив, используя:

myDictionary.Values.ToArray()

Будет ли массив выходить в том порядке, в котором я его ввел? Или это сортируется на каком-то этапе?

Ответы [ 3 ]

12 голосов
/ 28 мая 2011

Если вы хотите, чтобы значения были отсортированы (по ключу), вам следует использовать SortedDictionary<K,V> или SortedList<K,V>

Для обычного словаря порядок значений зависит от реализации, но вы можете также предположить, что он случайный.

Порядок ввода потерян.

9 голосов
/ 28 мая 2011

Порядок, в котором возвращаются значения, скорее всего (но не гарантируется) будет тем же порядком, в котором хранятся ключи.Как упомянул Хенк Холтерман, это зависит от реализации и на него не следует полагаться.

Запись MSDN для словаря очень четко говорит об этом:

Для целейперечисления, каждый элемент в словаре обрабатывается как структура KeyValuePair, представляющая значение и его ключ.Порядок, в котором элементы возвращаются, не определен.

EDIT Словарь может заманить вас в ложное чувство безопасности, по-видимому, возвращая значения в порядке их добавления, но нижеПроходной тест показывает, что его поведение на самом деле гораздо более тонкое:

[TestMethod]
public void TestDictionary()
{
    var dictionary1 = new Dictionary<int, int>();
    var dictionary2 = new Dictionary<int, int>();
    for(int i = 0; i < 10; i++){
        dictionary1[i] = i;
        if (i != 3)
            dictionary2[i] = i;
    }

    dictionary1.Remove(3);
    dictionary1[3] = 3;
    dictionary2[3] = 3;

    CollectionAssert.AreEqual(new[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }, dictionary1.Values);
    CollectionAssert.AreEqual(new[] { 0, 1, 2, 4, 5, 6, 7, 8, 9, 3 }, dictionary2.Values);
}

Если вы внимательно посмотрите на код, вы увидите, что порядок элементов в словаре не соответствует порядку добавления элементов, но порядок, в котором элементы первоначально добавляются .

Я не хочу вообразить, что происходит с несколькими вставками и удалениями с течением времени.Если вы полагаетесь на это недокументированное поведение, я думаю, что вы будете должны миру эквивалент государственного долга США с плохими смещениями кодов .

1 голос
/ 28 мая 2011

Если myDictionary имеет тип Dictionary<K,V>, то порядок совпадает с порядком, используемым Keys, и в противном случае не определен.В частности, не гарантируется, что это будет порядок вставки, или любой другой полезный порядок, или даже то, что это один и тот же порядок в разных запусках одного и того же приложения.

Порядок значений в Словаре.Значение ValueCollection не указано, но оно имеет тот же порядок, что и связанные ключи в Dictionary.KeyCollection, возвращаемом свойством Keys.

http://msdn.microsoft.com/en-us/library/ekcfxy3x.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...