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

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

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

    set
    {
        m_Users = value;
    }
}

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

Ответы

Ответ 1

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

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 из моего предыдущего фрагмента.

Ответ 2

Используйте свойство indexer (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";

Ответ 3

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

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

Ответ 4

Похоже, вы хотите "named indexer". Здесь (мой) один способ сделать это с помощью С#.

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

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

Ответ 5

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

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

Лучше всего использовать пару методов, которые вы можете назвать Get и Set, если вы этого хотите.

Ответ 6

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;
}