1

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

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

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

但是稍后我们需要快速查看孩子是否在露营中,如果是,孩子在露营中。使用上面的代码,这意味着循环遍历露营的完整列表和孩子列表。

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

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

4

2 回答 2

1

Child唯一的解决方案是从to有第二个字典映射CampingDictionary<Child, Camping>

于 2013-02-08T10:46:51.560 回答
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);

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

于 2013-02-08T10:51:38.967 回答