Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
0 / 0 / 0
Регистрация: 26.03.2022
Сообщений: 8

При добавлении новой пары ключ-значение в словарь, все значения словаря перезаписываются

25.09.2022, 06:50. Показов 978. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Вот код для класса, в котором храню экземпляры класса погода
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
internal class WeatherData
    {
        public Dictionary<string, SortedList<string, Weather>> weatherDict { get; set; }
        public WeatherData()
        {
            weatherDict = new Dictionary<string, SortedList<string, Weather>>();
        }
        public void ADD(Weather wthr)
        {
            SortedList<string, Weather> sortList = new()
            {
                { wthr.date, wthr }
            };
            if (weatherDict.ContainsKey(wthr.region.city))  //по индексу
            {
                if (weatherDict[wthr.region.city].ContainsKey(wthr.date))
                {
                    // weatherDict[wthr.region.city].Remove(wthr.date);
                    weatherDict[wthr.region.city][wthr.date] = wthr;
                }
                else
                {
                    weatherDict[wthr.region.city].Add(wthr.date, wthr);
                    //weatherDict[wthr.region.city][wthr.date] = wthr;
                }
            }
            else
            {
                weatherDict.Add(wthr.region.city, sortList);
                //weatherDict[wthr.region.city] = sortList;
            }
 
        }
    }
А вот отрывок из main
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
 WeatherData weatherData = new();
            Weather weather = new()
            {
                region = new Place
                {
                    city = "Moscow",
                    country = "Russia"
                },
                date = "24.09.2022",
                description = "Rainy",
                temperatureNow = new Temperature
                {
                    value = 21,
                    unit = "C"
                },
                temperatureMin = new Temperature
                {
                    value = 17,
                    unit = "C"
                },
                temperatureMax = new Temperature
                {
                    value = 25,
                    unit = "C"
                },
                wind = new Wind
                {
                    speed = 3,
                    unit = "m/s"
                },
                pressure = 749,
                humidity = 70
            };
            string choice;
            int serialization = 1;
            while (true)
            {
                drawMenu(serialization);
                choice = ReadLine();
                switch (choice)
                {
                    case "1":
                        {
                            Clear();
                            switch (serialization)
                            {
                                case 1://json
                                    {
                                       
                                        //string json = SerDeser.SerializeJson(weather);
                                        weatherData.ADD(weather);
                                          *Дальше не связанный с темой код и остальные кейсы*
В одном из кейсов применяю метод для изменения полей класса, вот и класс:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
internal class Place
    {
        public string country { get; set; }
        public string city { get; set; }
 
    }
    internal class Temperature
    {
        public double value { get; set; }
        public string unit { get; set; }
    }
    public class Wind
    {
        public double speed { get; set; }
        public string unit { get; set; }
    }
    internal class Date
    {
        public static bool operator ==(Date date1, Date date2)
        {
            return date1.day == date2.day && date1.month == date2.month && date1.year == date2.year;
        }
        public static bool operator !=(Date date1, Date date2)
        {
            return date1.day != date2.day || date1.month != date2.month || date1.year != date2.year;
        }
        public int day;
        public int month;
        public int year;
    }
    internal class Weather
    {
public void Change()
        {
            
            Write("Current date: "); date = ReadLine();
            Write("Enter country >> "); region.country = ReadLine();
            Write("Enter city >> "); region.city = ReadLine();
            Write("Enter description of weather >> "); description = ReadLine();
            Write("Enter unit of temperature(C/F) >> "); string unit = ReadLine();
            Write("Temperature now >> "); temperatureNow.value = Convert.ToDouble(ReadLine()); temperatureNow.unit = unit;
            Write("Today's max temperature >> "); temperatureMax.value = Convert.ToDouble(ReadLine()); temperatureMax.unit = unit;
            Write("Today's min temperature >> "); temperatureMin.value = Convert.ToDouble(ReadLine()); temperatureMin.unit = unit;
            Write("Wind speed >> "); wind.speed = Convert.ToDouble(ReadLine());
            Write("Unit of speed >> "); wind.unit = ReadLine();
            Write("Pressure in мм рт ст >> "); pressure = Convert.ToInt32(ReadLine());
            Write("Humidity in % >> "); humidity = Convert.ToInt32(ReadLine());
        }
        public Place region { get; set; }
        public string date { get; set; }
        public string description { get; set; }
        public Temperature temperatureNow { get; set; }
        public Temperature temperatureMin { get; set; }
        public Temperature temperatureMax { get; set; }
        public Wind wind { get; set; }
        public int pressure { get; set; }
        public int humidity { get; set; }
    }
Вот, проблема в том, что, например, изменив значения полей объекта weather и добавив его в словарь на хранения я просматриваю что хранится в словаре, а там все значения словаря перезаписываются на последний добавленный. Я уже много часов пытаюсь понять в чем проблема, но все никак не пойму, помогите, пожалуйста!
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
25.09.2022, 06:50
Ответы с готовыми решениями:

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

При добавлении новой строки в datagridview увеличивать значение столбца на единицу
Добрый день. Нужна небольшая помощь. Работаю с компонентом datagridview, нужно, чтобы при автоматическом добавлении новой строки, значение...

Как при добавлении новой строки в базу увеличить значение поля id на 1
Народ, не могу сообразить как впихнуть в этот метод добавления новой строки, увеличение значения поля id в таблице на единицу. Но...

5
 Аватар для limeniye
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
25.09.2022, 07:31
Во-первых, исходя из кода, который Вы приложили, то кроме экземпляра объекта weather Вы больше никакие другие экземпляры в цикле while не добавляете в словарь

weatherData.ADD(weather);

Добавлено через 12 минут
Во-вторых, Ваш метод ADD. Обратите внимание на вот этот участок кода:
C#
1
2
3
4
5
                if (weatherDict[wthr.region.city].ContainsKey(wthr.date))
                {
                    // weatherDict[wthr.region.city].Remove(wthr.date);
                    weatherDict[wthr.region.city][wthr.date] = wthr;
                }
weatherDict[wthr.region.city][wthr.date] = wthr; -- стирает всю прошлую информацию и заменяет её одним последним элементом.
0
0 / 0 / 0
Регистрация: 26.03.2022
Сообщений: 8
25.09.2022, 07:51  [ТС]
weatherDict[wthr.region.city][wthr.date] = wthr -тут я подразумевал, что прогноз для конкретного города и конкретной погоды(ключ для первого словаря и ключ для внутренней коллекции) изменяется на переданный для метода
Нет, я через другой кейс изменяю поля объекта, то есть перезаписываю прогноз погоды, а затем добавляю через 1 кейс в объект для хранения. Хотя вот я сейчас подумал, что надо в кейс, где меняю значения полей объекта weather, просто каждый раз новый создавать объект( тк в кейсе он будет локальным) и сделать сразу же добавление на хранение

Добавлено через 4 минуты
Вот вы про участок кода подметили, а можете, пожалуйста, подсказать как лучше сделать?
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18279 / 14202 / 5368
Регистрация: 17.03.2014
Сообщений: 28,882
Записей в блоге: 1
25.09.2022, 09:49
Лучший ответ Сообщение было отмечено d3f3nd3r как решение

Решение

Цитата Сообщение от d3f3nd3r Посмотреть сообщение
изменив значения полей объекта weather и добавив его в словарь на хранения я просматриваю что хранится в словаре, а там все значения словаря перезаписываются на последний добавленный.
Похоже вы работает с одним и тем же экземпляром Weather. Нужно создавать новый для нового прогноза. Начать можно с переписывания метода Change который теперь будет называться Input.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
        public static Weather Input()
        {
            Weather weather = new Weather()
            {
                region = new Place(),
                temperatureNow = new Temperature(),
                temperatureMin = new Temperature(),
                temperatureMax = new Temperature(),
                wind = new Wind()
            };
 
            Write("Current date: "); weather.date = ReadLine();
            Write("Enter country >> "); weather.region.country = ReadLine();
            Write("Enter city >> "); weather.region.city = ReadLine();
            Write("Enter description of weather >> "); weather.description = ReadLine();
            Write("Enter unit of temperature(C/F) >> "); weather.string unit = ReadLine();
            Write("Temperature now >> "); weather.temperatureNow.value = Convert.ToDouble(ReadLine()); weather.temperatureNow.unit = unit;
            Write("Today's max temperature >> "); weather.temperatureMax.value = Convert.ToDouble(ReadLine()); weather.temperatureMax.unit = unit;
            Write("Today's min temperature >> "); weather.temperatureMin.value = Convert.ToDouble(ReadLine()); weather.temperatureMin.unit = unit;
            Write("Wind speed >> "); weather.wind.speed = Convert.ToDouble(ReadLine());
            Write("Unit of speed >> "); weather.wind.unit = ReadLine();
            Write("Pressure in мм рт ст >> "); weather.pressure = Convert.ToInt32(ReadLine());
            Write("Humidity in % >> "); weather.humidity = Convert.ToInt32(ReadLine());
 
            return weather;
        }
1
0 / 0 / 0
Регистрация: 26.03.2022
Сообщений: 8
25.09.2022, 13:12  [ТС]
А если несложно, можете помочь с xml сериализацией и бинарной? Просто json сериализация в этом случае достаточно простая, а с остальными у меня проблема
0
 Аватар для limeniye
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
25.09.2022, 15:58
Взято у Элд Хасп
[Источник]

Копируем в буфер всё содержимое XML файла dataStDor.xml.
Ставим клавиатурный курсор на пустую строку внутри пространства имён StDorModel.XMLClases файла нашей "рыбы" StudentDormitoriesXML.cs.

Заходим "Меню" -> "Правка" -> "Специальная вставка" -> "Вставить XML как классы".

Получаем структуру для десериализации XML
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
25.09.2022, 15:58
Помогаю со студенческими работами здесь

Как сделать, чтоб при добавлении новой записи изменялось значение ProgressBar1?
Есть форма1, в ней кнопка1, по нажатию на которой производиться заполнение БД. Есть форма2 с ProgressBar1. Не могу сделать, чтоб при...

Замена NULL на значение по умолчанию при добавлении новой строки в DataGridView с заданным DataSource
Доброго времени суток! Для DataGridView в качестве источника данных задана DataTable заполняемая из БД. В БД для некоторых столбцов...

Словарь, просуммировать значения словаря по категорями
Всем доброго! Имеется вот такая импровизированная &quot;база данных&quot; expenses = Как можно просуммировать &quot;amount&quot;...

Вычисляет ли словарь хеш, если ключ - числовое значение или в таком случае за хеш берется сам ключ?
Нужен Dictionary&lt;int,Dictionary&lt;int,string&gt;&gt; (т.к. максимальное значение ключа не более 40 можно заменить на...

Создание словаря ключ - значение на C
Здравствуйте! Нужно создать структуру словарь типа ключ - значение на языке C. С возможностью добавления, удаления, очистки и удаления по...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru