当两个值都是键时要使用的集合
本文关键字:集合 两个 | 更新日期: 2023-09-27 17:58:13
我正在寻找适合以下情况的集合:
每个露营都是独一无二的每个孩子都是独一无二的,但不一定要去露营。在代码中,我会将其构建为:
Dictionary<Camping, List<Child>> list = new Dictionary<Camping, List<Child>>()
那么对于每个在露营的孩子
private void AddChildToCamping(Camping camping, Child child)
{
if (!list .ContainsKey(camping))
{
list .Add(camping, new List<string>());
}
list[camping].Add(child);
}
但稍后我们需要快速查看孩子是否在露营,如果是,孩子在哪里露营。对于上面的代码,这意味着循环浏览Campings和list of Child的完整列表。
bool foundInCamping = false;
foreach (Camping key in list.Keys)
{
List<Child> children;
bool ok = list.TryGetValue(key, out children);
if (ok)
{
if (children.Contains(targetChild))
{
foundInCamping = true;
break;
}
}
}
有更好的方法来实现这一点吗?
唯一的解决方案是使用从Child
到Camping
的第二个字典映射:Dictionary<Child, Camping>
我使用以下扩展方法来实现这一点:
public static KeyType[] ReverseLookup<KeyType, ValueType>(this Dictionary<KeyType, ValueType> subject, object lookupValue)
// where KeyType : class
where ValueType : class
{
var channels =
from KeyValuePair<KeyType, ValueType> dcPair in subject
where dcPair.Value == lookupValue
select dcPair.Key;
return channels.ToArray();
}
请注意,尽管每个键只能出现一次,但没有什么可以阻止一个值与多个键一起出现,因此您可以返回ketype[]。
用法:Keytype[]myKeys[]=myDictionary。反向查找(myValue);
如果你想要一对一的映射字典,我想你必须写自己的版本。。。