两个值都是键时要使​​用的集合

时间:2013-02-08 10:44:28

标签: c# optimization collections

我正在寻找适用于以下情况的正确集合:

每个露营都是独一无二的 每个孩子都是独一无二的,但不必在露营。 在代码中我会将其构建为:

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;
        }
    }
}

有没有更好的方法来实现这一目标?

2 个答案:

答案 0 :(得分:1)

唯一的解决方案是拥有从ChildCamping的第二个字典映射: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);

如果您想要一对一的映射字典,我认为您将不得不编写自己的版本...