16

Linq / Lambda と次の問題について質問があります。

プライマリとセカンダリの 2​​ つの辞書があります。これら 2 つの辞書は、キー = 文字列、値 = int として定義されています。キーが二次辞書と交差する場合、一次辞書を削除する必要があります。

すなわち:

primaryDict = ["thing1", 33] ["thing2", 24] ["thing3", 21] ["thing4", 17] ["thing5", 12]

secondaryDict = ["thing1", 22] ["thing3", 20] ["thing4", 19] ["thing7", 17] ["thing9", 10]

resultDict = ["thing1", 33] ["thing3", 21] ["thing4", 17]

私の試み:

resultDict = primaryDict.Keys.Intersect(secondaryDict.Keys).ToDictionary(t => t.Key, t.Value);

primaryDict.Keys.Intersect がキーのリストを返しているため、これは明らかに機能しません...どうすれば新しい辞書を再確立したり、プライマリ辞書をペアにしたりできますか? どんな助けでも大歓迎です。

4

4 に答える 4

25

あなたはこのようにすることができます:

resultDict =  primaryDict.Keys.Intersect(secondaryDict.Keys)
                              .ToDictionary(t => t, t => primaryDict[t]);

または、代わりに:

resultDict =  primaryDict.Where(x => secondaryDict.ContainsKey(x.Key))
                         .ToDictionary(x => x.Key, x => x.Value);

後者は、使い捨てコレクション (Intersect メソッドによって生成されるコレクション) の作成を回避し、 への 2 番目のキーによるアクセスを必要としないため、わずかに効率的ですprimaryDict

編集(コメントによる):

resultDict =  
primaryDict.Where(x => secondaryDict.ContainsKey(x.Key))
           .ToDictionary(x => x.Key, x => x.Value + secondaryDict[x.Key]);
于 2012-05-21T12:24:18.520 に答える
4

新しいprimaryDict辞書を作成しているため、Linq ステートメント内で引き続き使用できます。これは、作成された変数にのみ割り当てられます。

resultDict = primaryDict.Keys
                        .Intersect(secondaryDict.Keys)
                        .ToDictionary(t => t, primaryDict[t]);
于 2012-05-21T12:23:31.483 に答える
2

未テスト:

resultDict = primaryDict.Keys.Intersect(secondaryDict.Keys).ToDictionary(t => t.Key, primaryDict[t.Key]);
于 2012-05-21T12:23:31.473 に答える
0

両方の辞書の「値」を持つオブジェクトを選択したい場合は、おそらくそれが必要なため、次のようなことを試すことができます。両方の辞書のキーが同じである、つまり、2 つのシステム間の GUID のように、それぞれを一緒にマップすると仮定します。

dictA.Keys.Intersect(dictB.Keys).Select(x => new MyMappingClass
{
    dictAValue= dictA[x], dictBValue= dictB[x]
})
于 2020-06-26T22:45:39.360 に答える