Как написать геттер и сеттер для словаря?

Как вы определяете метод получения и установки для сложных типов данных, таких как словарь?

public Dictionary<string, string> Users
{
    get
    {
        return m_Users;
    }

    set
    {
        m_Users = value;
    }
}

Это возвращает весь словарь? Можете ли вы написать установщик, чтобы посмотреть и посмотреть, существует ли конкретная пара ключ-значение, а затем, если она не существует, добавить ее. Иначе обновить текущую пару ключ-значение? Для получения вы можете вернуть определенную пару ключ-значение вместо всего словаря?

 Mausimo20 июл. 2012 г., 18:57
Спасибо за ответы. Теперь я знаю варианты, которые у меня есть. Я предпочитаю создавать методы get и set, а не использовать индексатор.
 Brian Rasmussen20 июл. 2012 г., 18:44
Используйте свойство индексатора. Увидетьmsdn.microsoft.com/en-us/library/aa288464(VS.71).aspx

Ответы на вопрос(6)

один способ сделать это с помощью C #.

Мой подход предоставляет свойство, которое возвращает объект (с индексатором по умолчанию), который будет выполнять индексацию в соответствующее поле с учетом лямбды, чтобы сделать это.

Есть причины, по которым вы можете или не хотите использовать этот метод, но я оставлю это вам. :)

 20 июл. 2012 г., 18:48
Почему бы просто не использовать индексатор напрямую?
 20 июл. 2012 г., 18:50
Потому что у меня может быть несколько индексаторов в классе, которые принимают одинаковые типы параметров. Children [int index] и Customers [int index]. Кроме того, вариант использования OP показывает использование имени как в obj.Foo [...], а не obj [...]

is возможно сделать это с помощью установщика, но крайне не рекомендуется, и совершенно невозможно с получателем, так как для определения того, что получить, не требуется никаких параметров.

Для сеттера вы должны были бы пройтиDictionary<string, string> с одной парой, но это идет вразрез с тем, что вы обычно ожидаете от получателя / установщика, и полностью останавливает настройку всего словаря.

Гораздо лучший способ - использовать пару методов, которые вы можете назвать Get и Set, если хотите.

Решение Вопроса

theoretically Можно написать установщик, но для получателя вам потребуется указать ключ, который вы хотите получить. Это невозможно, поскольку свойства не принимают параметры. Естественный способ достичь желаемого - использовать методы:

private Dictionary<string, string> users = new Dictionary<string, string>();

public void Set(string key, string value)
{
    if (users.ContainsKey(key))
    {
        users[key] = value;
    }
    else
    {
        users.Add(key, value);
    }
}

public string Get(string key)
{
    string result = null;

    if (users.ContainsKey(key))
    {
        result = users[key];
    }

    return result;
}

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

И просто ради полноты, вот как может выглядеть сеттер, хотя очень необычно и нелогично иметь такое свойство:

public KeyValuePair<string, string> Users
{
    set
    {
        Set(value.Key, value.Value);
    }
}

Внутренне он используетSet метод из моего предыдущего фрагмента.

 20 июл. 2012 г., 19:04
Я бы не сказал ничего нормального, но вы не только сказали, что это технически невозможно (что верно), но и сказали, что это технически невозможноboth cases (что не соответствует действительности). Это & APOS; simpossible для добытчика, иinconvenient and un-intuitive через сеттер.
 20 июл. 2012 г., 18:49
Может использовать свойство индексатора, метод сам по себе не нужен ....
 20 июл. 2012 г., 19:34
@Servy Вы правы. Напоминает мне быть осторожным при формулировании моих ответов :)
 20 июл. 2012 г., 18:56
@Servy Конечно,technicallyВы могли бы, но это было бы довольно неестественно.
 20 июл. 2012 г., 18:48
Стоит отметить, что вы можете технически использовать свойство для установки значений (просто иметь свойство типа «keyvaluepair»). Вы просто не можете использоватьgetter, чтобы получить значение (или пару) для ключа, поскольку вы не можете указать ключ.

льзовать методы или добавить индексатор в свой класс.get Метод не может принять параметр (ключ).

Другой вариант, если вы хотите, чтобы кто-то мог легко добавлять / удалять ключи в словаре, но не позволял им устанавливать совершенно новый, было бы сделать свойство доступным только для чтения, которое возвращает словарь, созданный в конструкторе. Это было бы менее гибко, чем добавление методов get / set, но в простых простых случаях это может быть просто замечательно.

 20 июл. 2012 г., 18:45
Есть способы делать то, что он хочет. Просто не напрямую.
 20 июл. 2012 г., 18:44
+1 индексатор, вероятно, то, что он хочет

MSDN):

public class YourClass
{
    private readonly IDictionary<string, string> _yourDictionary = new Dictionary<string, string>();

    public string this[string key]
    {
        // returns value if exists
        get { return _yourDictionary[key]; }

        // updates if exists, adds if doesn't exist
        set { _yourDictionary[key] = value; }
    }
}

Тогда используйте как:

var test = new YourClass();
test["Item1"] = "Value1";
 12 июн. 2013 г., 10:03
Неплохо! Но, как сказал Никола Анусев, при настройке свойства вы должны проверить, существует ли оно с_yourDictionary.ContaineKey(key), И если он не существует, вы должны установить его сyourDictionary.Add(key, value)
 07 дек. 2018 г., 19:34
@TGarrett Это класс-оболочка для нестатического класса Dictionary. Во всяком случае, это может быть сделано общим, но я не вижу необходимости в статической реализации. Если вы это сделаете, я все уши!
 18 мая 2015 г., 15:42
Это будет работать только в том случае, если класс не является статическим, возможно, стоит подумать об альтернативе для статического класса ...
Dictionary<string, string> param = new Dictionary<string, string>();

public void SetYourParameter(string parametrName, string paramValue)
{
    param[parametrName] = paramValue;            
}

public string GetYourParameter(string parametrName)
{
    // ContainKey ---> It returns value if the key was found
    if( param.ContainsKey(parametrName))
        return param[parametrName];
    else
        return null;
}

Ваш ответ на вопрос