Вопрос по getter-setter, c#, dictionary – Как написать геттер и сеттер для словаря?

19

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

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

    set
    {
        m_Users = value;
    }
}

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

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

Ваш Ответ

6   ответов
0
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;
}
0

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

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

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

18

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

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

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

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

Есть способы делать то, что он хочет. Просто не напрямую.
+1 индексатор, вероятно, то, что он хочет
0

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

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

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

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

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";
Неплохо! Но, как сказал Никола Анусев, при настройке свойства вы должны проверить, существует ли оно с_yourDictionary.ContaineKey(key), И если он не существует, вы должны установить его сyourDictionary.Add(key, value)
Это будет работать только в том случае, если класс не является статическим, возможно, стоит подумать об альтернативе для статического класса ...
@TGarrett Это класс-оболочка для нестатического класса Dictionary. Во всяком случае, это может быть сделано общим, но я не вижу необходимости в статической реализации. Если вы это сделаете, я все уши!

Похожие вопросы