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

本文关键字:集合 两个 | 更新日期: 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;
        }
    }
}

有更好的方法来实现这一点吗?

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

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

如果你想要一对一的映射字典,我想你必须写自己的版本。。。