3

与えられた

Dictionary<string, List<string>> myDict = new Dictionary<string, List<string>>()
{
    "Apples", new List<string>() { "Green", "Red" },
    "Grapefruits", new List<string>() { "Sweet", "Tart" },
}

子から親へのマッピングを作成したい、例えば

「緑」=>「りんご」

私の特定のユースケースでは、子文字列はグローバルに一意であるため(たとえば、心配するグリーングレープフルーツはありません)、マッピングはになりますDictionary<string,string>

myDict従来の方法で繰り返すことで達成するのはかなり簡単です。

Dictionary<string, string> map = new Dictionary<string,string>();
foreach (KeyValuePair<string, List<string>> kvp in myDict)
{
    foreach (string name in kvp.Value)
    {
        map.Add(name, kvp.Key);
    }
}

これはLinqで実行できますか?

同じデータ構造をフラット化することについて、非常によく似た質問があります

Linqを使用してリストのC#ディクショナリをフラット化する

ただし、それは辞書キーとの関係を維持しません。

SelectMany(関連する質問で使用されているアプローチ)に関する優れたビジュアルチュートリアルを確認しましたが、キーを関連付ける方法がわかりません。

4

1 に答える 1

5

あなたが望むように聞こえます:

var query = myDict.SelectMany(pair => pair.Value,
                              (pair, v) => new { Key = v, Value = pair.Key })
                  .ToDictionary(pair => pair.Key, pair => pair.Value);

ここでの2番目の引数は、元のキーが最終的な辞書の値になり、その逆もあるSelectManyため、ここでは少し奇妙に見えることに注意してください。

于 2012-09-12T21:00:15.013 に答える