23

辞書などの複雑なデータ型のゲッターとセッターをどのように定義しますか?

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

    set
    {
        m_Users = value;
    }
}

これは辞書全体を返しますか?特定のキーと値のペアが存在するかどうかを確認し、存在しない場合は追加するセッターを作成できますか。それ以外の場合は、現在のキーと値のペアを更新しますか?getの場合、辞書全体ではなく、特定のキーと値のペアを返すことができますか?

4

6 に答える 6

30

インデクサープロパティを使用する(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";
于 2012-07-20T16:53:35.163 に答える
20

プロパティのみを含む方法でそれを行うことはできません。理論的にはセッターを作成できますが、ゲッターの場合は、取得するキーを指定する必要があります。プロパティはパラメータを受け入れないため、これは不可能です。あなたが望むことを達成するための自然な方法は、メソッドを使用することです:

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、前のスニペットのメソッドを使用します。

于 2012-07-20T16:47:22.233 に答える
1

あなたはプロパティでそれを行うことはできません。そのためのメソッドを使用するか、クラスにインデクサーを追加する必要があります。メソッドはgetパラメーター(キー)を受け入れることができません。

別のオプションとして、誰かが辞書にキーを簡単に追加/削除できるようにしたいが、まったく新しいキーを設定できないようにする場合は、コンストラクターで作成された辞書を返す読み取り専用プロパティをプロパティにすることです。get / setメソッドを追加するよりも柔軟性は低くなりますが、一般的な単純なケースでは問題なく実行できます。

于 2012-07-20T16:44:06.347 に答える
1

「名前付きインデクサー」が必要なようです。これが(私の)C#を使用してそれを達成する1つの方法です。

私のアプローチでは、ラムダが指定された場合に適切なフィールドへのインデックス作成を実行するオブジェクト(デフォルトのインデクサーを使用)を返すプロパティを公開します。

この方法を使用する場合と使用しない場合がある理由はいくつかありますが、それはお任せします。:)

于 2012-07-20T16:44:40.893 に答える
0

セッターを使用してこれを行うこと可能ですが、非常に推奨されていません。また、取得するものを決定するためのパラメーターを必要としないため、ゲッターを使用することは完全に不可能です。

セッターの場合、1つのペアでを渡す必要がありDictionary<string, string>ますが、ゲッター/セッターが通常行うことを期待することに反し、辞書全体の設定を完全に停止します。

より良い方法は、必要に応じてGetとSetという名前を付けることができる2つのメソッドを使用することです。

于 2012-07-20T16:49:43.280 に答える
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;
}
于 2014-04-07T11:52:39.533 に答える