我正在寻找适用于以下情况的正确集合:
每个露营都是独一无二的 每个孩子都是独一无二的,但不必在露营。 在代码中我会将其构建为:
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和Child of List的完整列表。
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;
}
}
}
有没有更好的方法来实现这一目标?
答案 0 :(得分:1)
唯一的解决方案是拥有从Child
到Camping
的第二个字典映射:Dictionary<Child, Camping>
答案 1 :(得分:0)
我正是使用以下扩展方法:
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.ReverseLookup(myValue);
如果您想要一对一的映射字典,我认为您将不得不编写自己的版本...