web-dev-qa-db-fra.com

Comment écrire un getter et un setter pour un dictionnaire?

Comment définissez-vous un getter et un setter pour des types de données complexes tels qu'un dictionnaire?

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

    set
    {
        m_Users = value;
    }
}

Cela renvoie le dictionnaire entier? Pouvez-vous écrire le setter pour regarder et voir si une paire clé-valeur spécifique existe et puis si ce n'est pas le cas, ajoutez-la. Sinon, mettre à jour la paire de valeurs clés actuelle? Pour obtenir, pouvez-vous renvoyer une paire clé-valeur spécifique au lieu du dictionnaire entier?

21
Mausimo

Il n'est pas possible de le faire d'une manière qui impliquerait uniquement des propriétés. Vous théoriquement pourriez écrire un setter, mais pour un getter, vous devrez spécifier une clé que vous souhaitez récupérer. C'est impossible car les propriétés n'acceptent pas de paramètres. La manière naturelle d'accomplir ce que vous voulez serait d'utiliser des méthodes:

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

Alternativement, comme d'autres l'ont déjà dit, vous pouvez utiliser des indexeurs, mais je les ai toujours trouvés un peu encombrants. Mais je suppose que c'est juste une question de préférence personnelle.

Et juste pour des raisons d'exhaustivité, voici à quoi pourrait ressembler un setter, bien qu'il soit très inhabituel et contre-intuitif d'avoir une telle propriété:

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

En interne, il utilise la méthode Set de mon extrait de code précédent.

18
Nikola Anusev

Utilisez une propriété d'indexeur ( 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; }
    }
}

Ensuite, utilisez comme:

var test = new YourClass();
test["Item1"] = "Value1";
27
James Michael Hare

Vous ne pourrez pas faire cela avec une propriété. Vous devrez utiliser des méthodes pour cela ou ajouter un indexeur à votre classe. La méthode get ne peut pas accepter un paramètre (la clé).

Une autre option, si vous voulez que quelqu'un puisse facilement ajouter/supprimer des clés au dictionnaire mais l'empêcher d'en définir une entièrement nouvelle serait de faire de la propriété une propriété en lecture seule qui renvoie un dictionnaire créé dans le constructeur. Il serait moins flexible que d'ajouter des méthodes get/set, mais dans des cas simples et courants, cela peut très bien fonctionner.

1
Servy

Il semble que vous souhaitiez un "indexeur nommé". Voici (ma) ne façon d'accomplir cela en utilisant C #.

Mon approche expose une propriété qui renvoie un objet (avec un indexeur par défaut) qui effectuera l'indexation dans le champ approprié compte tenu des lambdas pour le faire.

Il y a des raisons pour lesquelles vous pouvez ou non vouloir utiliser cette méthode, mais je vous laisse cela. :)

1
Ani
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
NG5121472

Il est possible de le faire avec le setter mais fortement déconseillé, et est complètement impossible avec le getter car il ne prend aucun paramètre pour déterminer quoi obtenir.

Pour le passeur, vous devrez passer un Dictionary<string, string> avec une seule paire, mais cela va à l'encontre de ce que vous attendez du getter/setter et fait que vous arrêtez complètement de définir le dictionnaire entier.

Une bien meilleure façon consiste à utiliser une paire de méthodes que vous pouvez nommer Get et Set si vous le souhaitez.

0
Graham Wager