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への2番目の辞書マッピングを用意することCampingです。Dictionary<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();
    }

各キーは1回しか表示できませんが、1つの値が複数のキーであるのを止めることはできないため、ketype[]が返されることに注意してください。

使用法:Keytype [] myKeys [] = myDictionary.ReverseLookup(myValue);

1対1のマッピング辞書が必要な場合は、独自のバージョンを作成する必要があると思います...

于 2013-02-08T10:51:38.967 に答える