質問: LINQ - リストの辞書を比較して新規および変更されたオブジェクトを検索する ここに私の問題があります: 私は同じ構造の2つの辞書を持っています: ``` Dictionary> Existing Dictionary> New ``` Basically what I need to do is to first find any `List that is in New but not in Existing based on the key and then find any Object in each `List contained in New that does not exist in its corresponding `List in Existing or is changed based on a number of properties in Object and, of course, the dictionary key. 私は現在、個々のオブジェクトをループしてチェックすることでこれをやっていますが、LINQを使ってこれを行うより良い方法があるはずです。 うまくいけばそれははっきりしていますが、あなたにさらなる情報が必要ならば教えてください。 ありがとう。 2 追加された 24 11月 2011 〜で 06:48 ビュー: 7 源 2 答え ----```
回答: As for new entries in the dictionary and new objects within an entry's `List: ``` List[] addedLists = New.Keys.Except(Existing.Keys) .Select(key => New[key]) .ToArray(); object[] addedObjects = Existing.Keys.Intersect(New.Keys) .SelectMany(key => New[key].Except(Existing[key]) .ToArray(); しかし、最後の要件は少し不明です。変更されたオブジェクトをどのように定義しますか?変更のためにどのオブジェクトを比較すべきか?どのオブジェクトも他のオブジェクトと比較すると、異なるものとして定義される可能性があるため、比較のベースとなる類似点(たとえば、 `ID` プロパティで同じ値を持つオブジェクト)が必要です。 **EDIT:** As you clarified in your comment how object identity is defined, here's how to find all changed objects (assuming the dictionary's value is a list of `Foo` that has a properties `Name` and `Type` that identify the object and property `Value` that may change: ``` var differences = Existing.Keys.Intersect(New.Keys).SelectMany(key => from existingObj in Existing[key] join newObj in New[key] on new { existingObj.Name, existingObj.Type } equals new { newObj.Name, newObj.Type } where existingObj.Value != newObj.Value select new { Key = key, Existing = existingObj, New = newObj }); ``` これにより、差異が見つかった辞書のキー、既存のオブジェクトおよび新しいオブジェクトをそれぞれ含む一連のオブジェクトが生成されます。同一のオブジェクトは結果に含まれません。 3 追加された 24 11月 2011 〜で 06:58 源 * それ * 数学 * コンピュータユーザ * システム管理者 * Ubuntu * UnixおよびLinux * エレクトロニクス * ゲーム * ソフトウェア工学 * Tex - LaTeX * Apple * 数学者 * 情報セキュリティー * コードレビュー * ロールプレイングゲーム * Magento * 統計 * 地理 * 数学 * Drupal * WordPress * サイエンスフィクション * SharePoint * ゲーム開発 * ユーザー体験 * 家の修繕 * SalesForce * アカデミア * 写真 * データベース管理 * Android * ウェブマスター * お金 * 旅行 * 化学 * Raspberry Pi * Blender 3Dグラフィックス * Webアプリケーション * 職場 * グラフィックデザイン * Arduino * ExpressionEngine * コンピュータサイエンス * ソフトウェアの推奨事項 * 自動車 * 料理 * 生物学 * Emacsの * 信号処理 * データサイエンス * 航空 * 定量的財務 * 音楽 * 自転車 * ワールドビルディング * ネットワーク工学 * 困惑 * 理論計算科学 * 哲学 * 園芸 * Craft CMS * ボードゲーム * 歴史 * アニメ * CiviCRM * 宇宙探査 * 音 * フィットネス * ソフトウェアテスト * 計算科学 * 書き込み * エンジニアリング * 経済 * コードゴルフ * 天文学 * ViとVim * ビデオ * Tridion * プロジェクト管理 * Joomla * リバースエンジニアリング * データを開く * スポーツ * ロボット工学 StackOverflow 源 licensed under cc by-sa 3.0 with attribution (function (d, w, c) { (w[c] = w[c] || []).push(function() { try { w.yaCounter51222095 = new Ya.Metrika({ id:51222095, clickmap:true, trackLinks:true, accurateTrackBounce:true, webvisor:true }); } catch(e) { } }); var n = d.getElementsByTagName("script")[0], s = d.createElement("script"), f = function () { n.parentNode.insertBefore(s, n); }; s.type = "text/javascript"; s.async = true; s.src = "https://mc.yandex.ru/metrika/watch.js"; if (w.opera == "[object Opera]") { d.addEventListener("DOMContentLoaded", f, false); } else { f(); } })(document, window, "yandex_metrika_callbacks"); ! window.dataLayer = window.dataLayer || []; function gtag(){dataLayer.push(arguments);} gtag('js', new Date()); gtag('config', 'UA-119143777-13'); ````