因此,如果我有一个字典,每个键可以占用更多的那个值(即Dictionary < string , Hashset < string >>
),现在我想检查dic [key a]是否包含一个值,例如“b”中的值dic [a]的hashset?怎么做?
答案 0 :(得分:3)
我认为测试存在的最有效方法是结构和检查函数是否定义如下:
// extension method on IDictionary<TKey, HashSet<TValue>> can be used
public static bool ContainsKeyValue<TKey, TValue>(IDictionary<TKey, HashSet<TValue>> dictOfHash, TKey key, TValue value)
{
if (!dictOfHash.ContainsKey(key))
return false;
return dictOfHash[key].Contains(value);
}
var dict = new Dictionary<int, HashSet<String>>()
{
{ 1, new HashSet<String>() { "one", "two", "three"} },
{ 2, new HashSet<String>() { "ten", "eleven", "twelve"} }
};
bool exists = ContainsKeyValue(dict, 1, "two");
exists = ContainsKeyValue(dict, 1, null);
exists = ContainsKeyValue(dict, 2, "one");
exists = ContainsKeyValue(dict, 3, null);
存在性检查的复杂度应为O(1),因为Dictionary<,>
和Hashset<>
的get / set复杂度均为O(1)。
答案 1 :(得分:1)
您可以使用扩展方法
public static bool Contains<Tkey, TValue>(this Dictionary<Tkey, IEnumerable<TValue>> dic, Tkey key, TValue val)
{
if (dic.ContainsKey(key))
return dic[key].Contains(val);
return false;
}
答案 2 :(得分:1)
试用IDictionary<>.TryGetValue
,保存一个表格查找:
public static bool Contains<TKey, TValue>(this IDictionary<TKey, HashSet<TValue>> dictionary, TKey key, TValue value)
{
var hashSet;
if(dictionary.TryGetValue(key, out hashSet))
{
return hashSet.Contains(value);
}
else
{
return false;
}
}