web-dev-qa-db-ja.com

キーと値のペアがディクショナリに存在するかどうかを確認する方法

キーと値のペアがDictionary <>に存在するかどうかを確認するにはどうすればよいですか? ContainsKeyContainsValueを使用してキーまたは値が存在するかどうかを確認することはできますが、キー/値のペアが存在するかどうかを確認する方法はわかりません。

ありがとう

20
user1261466

keyが存在しない場合、ペアは存在できません...そのため、キーに関連付けられた値を取得し、それが探している値であるかどうかを確認します。たとえば、次のとおりです。

// Could be generic of course, but let's keep things simple...
public bool ContainsKeyValue(Dictionary<string, int> dictionary,
                             string expectedKey, int expectedValue)
{
    int actualValue;
    if (!dictionary.TryGetValue(expectedKey, out actualValue))
    {
        return false;
    }
    return actualValue == expectedValue;
}

またはもう少し「巧妙に」(通常は避けるべき何か...):

public bool ContainsKeyValue(Dictionary<string, int> dictionary,
                             string expectedKey, int expectedValue)
{
    int actualValue;
    return dictionary.TryGetValue(expectedKey, out actualValue) &&
           actualValue == expectedValue;
}
39
Jon Skeet

辞書はキーごとに1つの値のみをサポートするため、次のようになります。

// key = the key you are looking for
// value = the value you are looking for
YourValueType found;
if(dictionary.TryGetValue(key, out found) && found == value) {
    // key/value pair exists
}
26
Marc Gravell
if (myDic.ContainsKey(testKey) && myDic[testKey].Equals(testValue))
     return true;
7
Wesley Long

これを行うには、dictionary.TryGetValueを使用します。

Dictionary<string, bool> clients = new Dictionary<string, bool>();
                    clients.Add("abc", true);
                    clients.Add("abc2", true);
                    clients.Add("abc3", false);
                    clients.Add("abc4", true);

                    bool isValid = false;

                    if (clients.TryGetValue("abc3", out isValid)==false||isValid == false)
                    {
                        Console.WriteLine(isValid);
                    }
                    else
                    {
                        Console.WriteLine(isValid);
                    }

上記のコードでは、条件に2つのセクションがあり、最初にキーに値があるかどうかを確認し、2番目に実際の値と期待値を比較します。

First Section{clients.TryGetValue("abc3", out isValid)==false}||Second Section{isValid == false}

こんな感じ

bool exists = dict.ContainsKey("key") ? dict["key"] == "value" : false;
1
Ash Burlaczenko
var result= YourDictionaryName.TryGetValue(key, out string value) ? YourDictionaryName[key] : "";

キーがディクショナリに存在する場合、キーの値を返します。それ以外の場合、空のオブジェクトを返します。

このコードがお役に立てば幸いです。

0
Nitika Chopra

Jon Skeet の答えの一般的なバージョン

        public bool ContainsKeyValue<TKey, TVal>(Dictionary<TKey, TVal> dictionnaire,
                                             TKey expectedKey,
                                             TVal expectedValue) where TVal : IComparable
    {
        TVal actualValue;

        if (!dictionnaire.TryGetValue(expectedKey, out actualValue))
        {
            return false;
        }
        return actualValue.CompareTo(expectedValue) == 0;
    }

単純な汎用拡張メソッド

ContainsPair()メソッドをIDictionaryに追加する簡単な汎用拡張メソッドを次に示します。

public static bool ContainsPair<TKey, TValue>(this IDictionary<TKey, TValue> dictionary,
                                                   TKey key,
                                                   TValue value)
{
    return dictionary.TryGetValue(key, out var found) && found.Equals(value);
}

これにより、次のような辞書に対してチェックを行うことができます。

if( myDict.ContainsPair("car", "mustang") ) { ... }     // NOTE: this is not case-insensitive

大文字と小文字を区別しないチェック

文字列ベースのキーを使用する場合、ディクショナリの作成時にStringComparer.OrdinalIgnoreCaseなどの比較演算子で作成することにより、キーに関してDictionaryの大文字と小文字を区別しないようにできます。

ただし、値の比較で大文字と小文字を区別しないようにするには(値も文字列であると想定)、IComparerパラメーターを追加するこのバージョンを使用できます。

public static bool ContainsPair<TKey, TValue>(this IDictionary<TKey, TValue> dictionary,
                                                   TKey key,
                                                   TValue value,
                                                   IComparer<TValue> comparer)
{
    return dictionary.TryGetValue(key, out var found) && comparer.Compare(found, value) == 0;
}
0
Jonathan B.