Лучший отвечающий
Выбор контейнера для обеспечения частичного обновления данных

Вопрос
-
Добрый день
Имеется некий пользовательский тип (может быть структура), который содержит в себе несколько полей. Например такой:
struct MyData { public int i; public string s; }
Требуется поместить объекты этого типа в ассоциативный контейнер, чтобы обеспечить к ним быстрый доступ. При этом необходимо обновлять некоторые поля типа. Т.е., например, если использовать Dictionary, получается следующее:
Dictionary< int, MyData > dic; ... dic[key] = new MyData() { i = dic[key].i + 1, s = dic[key].s }
Хотелось бы избежать лишних присваиваний для полей, которые не модифицируются ('s' в примере). Подскажите пожалуйста как это лучше реализовать?
Заранее спасибо.
5 октября 2012 г. 12:41
Ответы
-
Короче говоря, проблема кроется в struct, т.к. это не ссылочный тип. Если объявить тип как class необходимый мне код будет таким:
dic[key].i = dic[key].i + 1; // или даже так dic[key].i++;
Т.е. без использования поля `s`, которое не модифицируется.
Как-то вылетела из головы под конец рабочего дня такая очевидная вещь ;)
- Изменено tulosba 5 октября 2012 г. 14:04
- Помечено в качестве ответа YatajgaModerator 5 октября 2012 г. 14:31
5 октября 2012 г. 14:04 -
Дело тут в следующем: индексатор возвращает копию структуры, поэтому компилятор нас предупреждает о бессмысленной операции. Т.е. мы можем читать поля, но писать их нет, так как копия временная, куда сохранять значение. Хотя по правде говоря сначала не посмотрел внимательно и не верно понял Вас. Под ухищрением я имел ввиду использование небезопасного кода, прямая манипуляция ссылками. Что совсем неуместно в данном контексте. Можно, но это будет уже шаманство.
- Изменено YatajgaModerator 6 октября 2012 г. 13:27
- Помечено в качестве ответа Abolmasov Dmitry 9 октября 2012 г. 10:10
6 октября 2012 г. 13:27Модератор
Все ответы
-
В общем то у Вас всё правильно реализовано. А поля, не нуждающиеся в присвоении значений, пропустите, просто не указав их.5 октября 2012 г. 13:27Модератор
-
В общем то у Вас всё правильно реализовано. А поля, не нуждающиеся в присвоении значений, пропустите, просто не указав их.
Может быть я недостаточно четко объяснил. Но суть в том, что поле либо изменяется на новое значение, либо остается прежним, что и было уже в контейнере. Если же просто опустить присваивание, будет задано значение по умолчанию. Для строки например null.5 октября 2012 г. 13:38 -
Если хотите что то присвоить укажите явно, если нет, опустите. В случае если поле опущено, будет присвоено дефолтовое значение типа. А если хотите чтобы поля имели заранее присвоенные значения, инициализируйте их в конструкторе класса. Другого варианта я не вижу, или может я не правильно понял Вас.5 октября 2012 г. 13:43Модератор
-
Короче говоря, проблема кроется в struct, т.к. это не ссылочный тип. Если объявить тип как class необходимый мне код будет таким:
dic[key].i = dic[key].i + 1; // или даже так dic[key].i++;
Т.е. без использования поля `s`, которое не модифицируется.
Как-то вылетела из головы под конец рабочего дня такая очевидная вещь ;)
- Изменено tulosba 5 октября 2012 г. 14:04
- Помечено в качестве ответа YatajgaModerator 5 октября 2012 г. 14:31
5 октября 2012 г. 14:04 -
В случае структуры код тоже может быть таким. В данном случае разницы нет, хотя нужно будет пойти на кое-какие ухищрения. Но если так, тогда лучше оставит всё-таки класс.
- Изменено YatajgaModerator 5 октября 2012 г. 14:33
5 октября 2012 г. 14:20Модератор -
В случае структуры код тоже может быть таким. В данном случае разницы нет, хотя нужно будет пойти на кое-какие ухищрения. Но если так, тогда лучше оставит всё-таки класс.
Вы не могли бы привести пример?5 октября 2012 г. 19:23 -
Дело тут в следующем: индексатор возвращает копию структуры, поэтому компилятор нас предупреждает о бессмысленной операции. Т.е. мы можем читать поля, но писать их нет, так как копия временная, куда сохранять значение. Хотя по правде говоря сначала не посмотрел внимательно и не верно понял Вас. Под ухищрением я имел ввиду использование небезопасного кода, прямая манипуляция ссылками. Что совсем неуместно в данном контексте. Можно, но это будет уже шаманство.
- Изменено YatajgaModerator 6 октября 2012 г. 13:27
- Помечено в качестве ответа Abolmasov Dmitry 9 октября 2012 г. 10:10
6 октября 2012 г. 13:27Модератор