На одном телеграмм-канале, кстати не плохом, по первому впечатлению, был опрос - "Что будет выведено на экран" (код ниже, ну и аналогичный опрос).
Отвечаем и читаем дальше.
Ctrl+C, Ctrl+V в помощь.
Продолжим
Я же знаю, что в словарях хранятся только уникальные ключи, он же для этого и разрабатывался, чтобы время поиска равнялось О(1). И моим ответом был пункт номер два. Но не тут то было. Оказывается, пункт номер три. Протестировал код и в правду номер 3. Побродил по просторам рунета и в итоге решил проверить, а как аналогичный код поведет себя на C#.
Отвечаем и читаем дальше.
Ctrl+C, Ctrl+V в помощь.
Вроде бы и не удивительно
Здесь ответ под номером один, т.е. программа сыпется сразу.
А что не так?
Когда начинаешь изучать такую структуру данных, как словарь, то первое о чем твердится, про уникальность ключей и скорость поиска, ведь уникальность ключей и позволяет достичь этой скорости. А раз ключ уникален, то дубль - это ошибка.
Но для тех, кто программирует на Python, нужно учитывать тот факт, что наличие дубликата в словаре при инициализации, это не ошибка. Я, вот, про это не знал, да и не задумывался ни когда.
Осмелюсь предположить, что это связано с тем, что Python - это интерпретируемый язык, а С# - компилируемый.
Интерпретатор, перебирая элементы словаря при инициализации, не производит явное добавление: он проверяет наличие ключа в словаре и если таковой есть, то просто перезаписывает его новым значением, а если элемента словаря с таким ключом нет, то происходит добавление нового элемента в словарь.
А вот компилятор, произведя подобные действия, при обнаружении дубликата создает исключение - ArgumentException.
Начиная с С# 6.0, так же доступен еще один способ инициализации.
Отвечаем и читаем дальше.
Ctrl+C, Ctrl+V в помощь.
Во дела
А вот здесь поведение аналогично поведению интерпретатора Python.
Данные обстоятельства навели меня на мысль - проверить, а что произойдет при добавлении дубликата в словарь. Об этом во второй части.
Вывод
Из примеров видно, что в Python, наличие дубликата в словаре при инициализации ни как не скажется на запуске программы. Но это может вылиться в ошибку, в другом месте программы, где этот ключ используется, будет извлекаться не верное значение. Этот момент надо учитывать при ручном формировании словаря или загрузке его из вне.
А вот в C# есть два способа инициализации словаря, один аналогичен способу Python, а другой не позволит проинициализировать дубликаты, но тогда это скажется на работе всей программы. И это нужно как-то обрабатывать.
Спасибо за потраченное время на прочтение.
Строго не судите.
За уместные комментарии буду признателен.