none
Выбор контейнера для обеспечения частичного обновления данных RRS feed

  • Вопрос

  • Добрый день

    Имеется некий пользовательский тип (может быть структура), который содержит в себе несколько полей. Например такой:

    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
    • Помечено в качестве ответа YatajgaEditor 5 октября 2012 г. 14:31
    5 октября 2012 г. 14:04
  • Дело тут в следующем: индексатор возвращает копию структуры, поэтому компилятор нас предупреждает о бессмысленной операции. Т.е. мы можем читать поля, но писать их нет, так как копия временная, куда сохранять значение. Хотя по правде говоря сначала не посмотрел внимательно и не верно понял Вас. Под ухищрением я имел ввиду использование небезопасного кода, прямая манипуляция ссылками. Что совсем неуместно в данном контексте. Можно, но это будет уже шаманство.
    • Изменено YatajgaEditor 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
    • Помечено в качестве ответа YatajgaEditor 5 октября 2012 г. 14:31
    5 октября 2012 г. 14:04
  • В случае структуры код тоже может быть таким. В данном случае разницы нет, хотя нужно будет пойти на кое-какие ухищрения. Но если так, тогда лучше оставит всё-таки класс.
    5 октября 2012 г. 14:20
    Модератор
  • В случае структуры код тоже может быть таким. В данном случае разницы нет, хотя нужно будет пойти на кое-какие ухищрения. Но если так, тогда лучше оставит всё-таки класс.

    Вы не могли бы привести пример?
    5 октября 2012 г. 19:23
  • Дело тут в следующем: индексатор возвращает копию структуры, поэтому компилятор нас предупреждает о бессмысленной операции. Т.е. мы можем читать поля, но писать их нет, так как копия временная, куда сохранять значение. Хотя по правде говоря сначала не посмотрел внимательно и не верно понял Вас. Под ухищрением я имел ввиду использование небезопасного кода, прямая манипуляция ссылками. Что совсем неуместно в данном контексте. Можно, но это будет уже шаманство.
    • Изменено YatajgaEditor 6 октября 2012 г. 13:27
    • Помечено в качестве ответа Abolmasov Dmitry 9 октября 2012 г. 10:10
    6 октября 2012 г. 13:27
    Модератор