С Новым годом! Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/9: Рейтинг темы: голосов - 9, средняя оценка - 4.78
13 / 9 / 4
Регистрация: 24.12.2020
Сообщений: 153

Работа со словарем - ошибка: An item with the same key has already been added. Key

10.05.2022, 19:03. Показов 2217. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, имеется такой код для записи словаря в файл
C#
1
2
3
4
5
6
7
            using (var writer = new StreamWriter("2" + s + "source.shf"))
            {
                foreach (var kvp in Codes)
                {
                    writer.WriteLine($"{kvp.Key}\t{kvp.Value}");
                }
            }
Считывание следующее
C#
1
2
3
4
        var Codes = File.ReadLines("2" + s + "source.shf")
              .Select(line => line.Split('\t'))
              .Where(arr => arr.Length == 2)
              .ToDictionary(arr => arr[0], arr => arr[1]);
Однако ошибка на выходе:
An item with the same key has already been added. Key

Может кто подсказать с чем это связано?
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
10.05.2022, 19:03
Ответы с готовыми решениями:

Подскажите пожалуйста, почему выходит ошибка " An item with the same key has already been added. Key: G"?
Я ничего не добавляю, лишь пытаюсь получить значение из словаря using System; using System.Collections.Generic; using...

Ошибка при открытии дизайнера WFP формы: An item with the same key has already been added
При открытии дизайнера любого xaml файла выходит следующая ошибка. Не могу понять, что и где фиксить. Сносил студию даже - не помогло ...

Как исправить ошибку "An item with the same key has already been added"?
У меня есть код: using System; using System.Collections.Generic; namespace Проверка { class Program { ...

16
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16118 / 11242 / 2887
Регистрация: 21.04.2018
Сообщений: 33,049
Записей в блоге: 2
10.05.2022, 19:29
Цитата Сообщение от Leooos Посмотреть сообщение
Может кто подсказать с чем это связано?
Без анализа получаемого файла невозможно определить причину.
Получите сначала промежуточный массив и проверьте на дублирование первые элементы:
C#
1
2
3
4
        var temp = File.ReadLines("2" + s + "source.shf")
              .Select(line => line.Split('\t'))
              .Where(arr => arr.Length == 2)
              .ToArray();
0
13 / 9 / 4
Регистрация: 24.12.2020
Сообщений: 153
10.05.2022, 19:30  [ТС]
Очень странно
На части тестов работает нормально. На тесте
"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum." портачит
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16118 / 11242 / 2887
Регистрация: 21.04.2018
Сообщений: 33,049
Записей в блоге: 2
10.05.2022, 19:34
Leooos, Также советую заменить код создания файла:
C#
1
2
            string fileName = "2" + s + "source.shf";
            File.WriteAllLines(fileName, Codes.Select(kvp => $"{kvp.Key}\t{kvp.Value}"));
Добавлено через 1 минуту
Цитата Сообщение от Leooos Посмотреть сообщение
На тесте
Что конкретно за задачу вы решаете?
0
13 / 9 / 4
Регистрация: 24.12.2020
Сообщений: 153
10.05.2022, 19:37  [ТС]
Элд Хасп

Какая-то магия происходит. Снова все работает.
Причем в конец добавилась только точка и теперь уже и без точки работает
Мда, в итоге оказалось, что ошибка идет из-за строки, которая появилась ниже после ctrl+v. То есть ошибка возникает из-за того, что в тестовом файле спускается на следующую строку текст(строка может быть как пустой. так и нет)

Это как-то возможно решить?

Добавлено через 2 минуты
Элд Хасп
Нужно словарь, который образуется после работы алгоритма Шеннона-Фано, вывести в отдельный текстовый файл, который можно было бы потом использовать для разархивации созданного архива
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16118 / 11242 / 2887
Регистрация: 21.04.2018
Сообщений: 33,049
Записей в блоге: 2
10.05.2022, 19:39
Цитата Сообщение от Leooos Посмотреть сообщение
Это как-то возможно решить?
Так ошибка когда возникает?
При обработке текста или при десериализации словаря?
1
13 / 9 / 4
Регистрация: 24.12.2020
Сообщений: 153
10.05.2022, 20:01  [ТС]
Элд Хасп

Поторопился я грешить на кусочек кода с записью и считыванием.
Прошел дэбагером на маленьком двустрочном тесте и узрел, что он переход на новую строку в .txt считает равным с пробелом.
Однако оказия в том, что он задваивает пробел.
Тест
qwe
asd


В моменте перехода на новую строку мы получаем пробел в словарь, а за ним сразу идет ещё один пробел, которого нет. Вот она и беда, вестимо ноги берет из заполнения словаря.
Но почему так?

Добавлено через 4 минуты
Однако я бы добавил, что без записи в файл все работает как надо.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16118 / 11242 / 2887
Регистрация: 21.04.2018
Сообщений: 33,049
Записей в блоге: 2
10.05.2022, 20:12
Цитата Сообщение от Leooos Посмотреть сообщение
Однако я бы добавил, что без записи в файл все работает как надо.
Так исключение когда выкидывается?
1
13 / 9 / 4
Регистрация: 24.12.2020
Сообщений: 153
10.05.2022, 20:17  [ТС]
Элд Хасп
Вот именно, что нет

Эта ошибка стала появляться только при появлении считывания с файла словаря

Добавлено через 1 минуту
Элд Хасп
Извиняюсь, прочитал неправильно

Исключение вываливается, когда нажимается в текстовом файле Enter и появляется новая строка. Он где-то берет второй пробел, хотя их вообще нет(если не считать за пробел переход по строкам)
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16118 / 11242 / 2887
Регистрация: 21.04.2018
Сообщений: 33,049
Записей в блоге: 2
10.05.2022, 20:23
Цитата Сообщение от Leooos Посмотреть сообщение
Исключение вываливается, когда нажимается в текстовом файле Enter и появляется новая строка.
То есть не при десериализации словаря?
1
13 / 9 / 4
Регистрация: 24.12.2020
Сообщений: 153
10.05.2022, 20:37  [ТС]
Элд Хасп

Получается, что да
Вестимо, ошибка берет ноги в заполнении этого словаря, причем такая ошибка, что ума не приложу, как избавиться

Добавлено через 10 минут
в словарь приходит \r и сразу за ним \n, видимо, где-то здесь кроется косяк и ключик, в словарь уходят сразу два пробела
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16118 / 11242 / 2887
Регистрация: 21.04.2018
Сообщений: 33,049
Записей в блоге: 2
10.05.2022, 20:48
Лучший ответ Сообщение было отмечено Leooos как решение

Решение

Если исходный Codes собирается и сохраняется без исключений, и исключение возникает только при десериализации, то проблема в формате сериализации.
Допустим, если у вас в key попадает \r или \n, то метод ReadLines разделит ключ на две строки.
Первая как короткая будет отброшена Where, а вторая с усечённым ключом пойдёт в словарь.

Если вам нужны \r\n в ключе или в значении словаря, то вам следует использовать XML или JSON сериализацию, а не свою кастомную в простой текстовый файл.
1
13 / 9 / 4
Регистрация: 24.12.2020
Сообщений: 153
10.05.2022, 21:07  [ТС]
Элд Хасп, Cпасибо вам огромное.
Переделал, все работает.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16118 / 11242 / 2887
Регистрация: 21.04.2018
Сообщений: 33,049
Записей в блоге: 2
10.05.2022, 21:58
Цитата Сообщение от Leooos Посмотреть сообщение
Переделал, все работает.
Кстати, если вам сериализация нужна только для сохранения и вы не планируете использовать сохранённый файл вне вашей программы, то можно использовать бинарную сериализацию.
Она создаёт самый оптимальный файл.
0
13 / 9 / 4
Регистрация: 24.12.2020
Сообщений: 153
10.05.2022, 22:51  [ТС]
Элд Хасп, этот файл будет использоваться сугубо для разархивации архивов, которые получаются посредством алгоритма Шеннона-Фано. Пойду почитаю про бинарную сериализацию, но JSON пока что показал себя очень даже не дурно, хоть просто зип все же лучше архивирует)
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16118 / 11242 / 2887
Регистрация: 21.04.2018
Сообщений: 33,049
Записей в блоге: 2
10.05.2022, 23:12
Цитата Сообщение от Leooos Посмотреть сообщение
хоть просто зип все же лучше архивирует
Zip кодирует двоичную инфу - вы текстовую.
Но проблема больше в том, что на выходе у Zip двоичный файл, а у вас символьный.
Попробуйте перейти от обработки символов (char) к обработке байтов.

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

Добавлено через 21 секунду
В том числе ключи и значения в словаре должны быть представлены байтами.
0
13 / 9 / 4
Регистрация: 24.12.2020
Сообщений: 153
10.05.2022, 23:18  [ТС]
Элд Хасп, хорошо, ещё раз спасибо, пораскину мозгами по поводу вашего совета
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
10.05.2022, 23:18
Помогаю со студенческими работами здесь

Ошибка при работе с указателем! (key[0]->pr) x006790b8 {size=3 d=2 key=0x0067dcc8 {0xfdfdfdfd {pr=? }
#ifndef DHEAP_H #define DHEAP_H #include <iostream> #include <locale.h> #include <cmath> #include <cstdlib> #include "Graph.h" ...

Преобразовать многомерный массив [key][key][key] => value
Как из такого массива: max => '20', min => '0', placeholder => 1 => 'value 1', 2 => 'value 2',

Ошибка Generation has thrown an exception: 'bpy_prop_collection[key]: key "ORG-cheek.T.L" not found' при создании рига
Всем софорумчанам привет! Кратко: создал персонажа, с помощью аддона rigify сделал ему human meta-rig, подровнял, перешел в pose mode,...

ошибка: need 'typename' before 'Dictionary<Key, Value>::Node_key' because 'Dictionary<Key, Value
привет всем! почему выскакивает ошибка /home/september/console/tabld_node/dictionary.cpp:93: ошибка: need 'typename' before...

#1170 - BLOB/TEXT column 'id' used in key specification without a key length
После выполнения этого кода: CREATE TABLE forum_themes( id TINYTEXT, name TINYINT, autor_name TINYTEXT, create_date DATETIME...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru