10

私は2種類の辞書Dictionary<int, Fooclass> oldDicを持っていDictionary<int, string> barList newDicます。次に、両方の辞書の値を比較する必要があります。たとえば、キーは次のようになります

  • oldDic:1,2,3
  • newDic:1,2,3,4
  • 期待される出力:4

今、私はそれらのキーに基づいて両方の辞書を比較する必要があります。助けていただければ幸いです。

編集:出力は2番目の辞書(newDic)のようになりますが、これには2番目の辞書(oldDic)の値が含まれます。例えば

1、 "fooString"ここで、fooStringはFooclassのsomepropertyの値です。...より明確にするために、これは私には機能しませんでした。

var addedList = from list1 in baseListDic
join list2 in trackerlist on list1.Key equals list2.Key
 select new { key = list1.Key, value = list1.Value._lead };

ここで、baseListDicはoldDicであり、trackerlistはnewDicです....まだ不明な場合はお知らせください...

4

4 に答える 4

15

古い辞書で同じキーを持つアイテムを無視して、新しい辞書に基づいて新しい辞書を作成する方が簡単です。

var result = newDic
    .Where(kvp => !oldDic.ContainsKey(kvp.Key))
    .ToDictionary(kvp => kvp.Key, kvp => kvp.Value);
于 2012-07-25T16:16:34.057 に答える
6

注:「両方の辞書のを比較する必要がある」という質問にもかかわらず(私の強調)、あなたの例はキーの比較だけを示しているように思われるので、それを使用しました。比較する必要のある値である場合は、意味の例を示し、それらが簡単に変換可能または比較可能であるかどうかを示します...

実際にキーを比較しているだけの場合は、linqを実行できる.Keys辞書のプロパティを使用IEnumerable<TKey>できます...

例えば:

var expectedOutput = newDic.Keys.Except(oldDic.Keys);

これは同じタイプのキーに依存しますが、比較する場合は言うまでもありません。もちろん、異なるタイプでこれを行う場合は、最初にタイプを変換することを妨げるものは何もありません。

また、辞書の1つで値を取得したい場合は、次のようにすることができます。

var newDicValues = expectedoutput.Select(x=>newDic[x]);

または、あなたが知っている、あなたが好きな他のlinqyのことをしてください。:)

于 2012-07-25T15:30:14.013 に答える
2

これを試して、2つの異なるリストの違いを確認してください。共通のプロパティがある場合。

 var differentItems = List<Type1>.Select(d => d.Name)
                        .Except(List<Type2>.Select(d => d.Name));
于 2013-05-15T10:47:27.870 に答える
0

正しく理解されている場合は、次のようなものを試してください

あなたがこのような別の辞書moethingを持っているならDictionary<int, Fooclass> FinalDict

            IEnumerable<int> list = OldDic.Keys.Except(NewDic.Keys);
            foreach (var x in list)
            {
                var value =new MyClass();
                OldDic.TryGetValue(x,out value );
                FinalDict.Add(x,value);
            }

したがって、FinalDictと呼ばれる辞書には、キーと関連するFooclassがあります。

お役に立てれば

于 2012-07-25T16:07:43.983 に答える