20

Dictionary<string, string>オブジェクトにすべてのオブジェクトのセットがキーとして含まれているかどうかを判断するための最良の方法を見つけようとしてstringいます。

私はおそらく意味をなさないので、ここに明確な文字列のセットを使用したいくつかのサンプルコードがあります:

public static bool ContainsKeys(this Dictionary<string, string> dictionary)
{
  return dictionary.ContainsKey("fname") && dictionary.ContainsKey("lname") && dictionary.ContainsKey("address1") &&
         dictionary.ContainsKey("city") && dictionary.ContainsKey("state") && dictionary.ContainsKey("zip");
}

ここでの考え方は、任意の文字列のセットをとして受け入れ、オブジェクトkeysのキーにのすべての文字列が含まれているかどうかを確認することです。Dictionary<string, string>keys

私はこれでLINQの道を下ろうとしていました:

public static bool ContainsKeys(this Dictionary<string, string> dictionary, string[] keys)
{
  var query = from entry in dictionary
              where keys.Contains(entry.Key)
              select entry;

  return query.Any();
}

しかし、私が正しい道を進んでいるかどうかはわかりませんdictionary。これらの文字列のいずれかがキーとして含まれているかどうかを知りたい場合は、これでうまくいくと思います。

4

5 に答える 5

31

このようなものがあなたの要件を満たすはずです。もちろん、引数に適切な検証を適用してください。

return keys.Any() 
    && keys.All(key => dictionary.ContainsKey(key));

注:ソース シーケンス (キー) が実際に空の場合はtrueを返すAnyため、含めます。これが気にならない場合は、 の使用をやめてください。AllAny

于 2013-02-20T20:38:11.180 に答える
5

これは、 All拡張メソッドを使用して非常に簡単に実行できます。

return keys.All(k => dictionary.ContainsKey(k));

これにより、指定された述語(dictionary.ContainsKey(k))が指定された配列内のすべてのキーに対して真であることが確認されます。

于 2013-02-20T20:40:07.160 に答える
4

LINQ は、次のような場合に適しています。

public static bool ContainsKeys(this Dictionary<string, string> dictionary, string[] keys)
{
  return keys.All(dictionary.ContainsKey);
}
于 2013-02-20T20:38:50.777 に答える
1

Exceptにあるキーを削除し、Dictionary何かが残っているかどうかを確認するために使用するだけです。

return !keys.Except(dictionary.Keys).Any();
于 2013-02-20T20:42:23.893 に答える