2つのコレクションを比較して、アイテムがソースコレクション内にあるか、比較対象のコレクション内にあるか、または両方にあるかに基づいてロジックを実行する必要がありますか?私もそうでした。UIとデータベースからのデータをマージする必要がありました。良い解決策が見つからなかったので、コレクション比較ツールを作成しました。
これがどのように機能するかを説明するために、例を見てみましょう。
ソースデータには値1、3、4、6があり、比較対象のコレクションには値1、2、3、4、5があります。
ソースデータは比較対象のコレクションと比較すると2と5が不足しており、比較対象のコレクションはソースコレクションと比較すると6が不足しています。
このマージを段階的に見てみましょう:
- 両方に含まれる(更新)
- 比較対象のコレクションのみに含まれる(ソースに追加)
- 両方に含まれる(更新)
- 両方に含まれる(更新)
- 比較対象のコレクションのみに含まれる(ソースに追加)
- ソースコレクションのみに含まれる(ソースから削除)
コードは次のようになります:
var source = new []{1, 3, 4, 6};
var collection = new[] {1, 2, 3, 4, 5};
source.CompareTo(collection, (s, d) => s == d)
.OnlyInSourceCollection(s=> {/* do something */})
.OnlyInComparingCollection(s=>{/* do something */})
.InBoth(s=> {/*do something*/})
.Process();
LINQを使わないのはなぜですか?
LINQを使用することはできますが、LINQはコレクションを少なくとも3回反復処理します。これにはデータの操作(追加、更新、削除)は含まれていません。CollectionComparerを使用すると、データは2回だけ反復処理されます。
バイナリサーチなど、差異を見つけるより高速な方法がありますが、バイナリサーチは整数でのみ機能します。コレクション比較ツールは、あらゆるタイプの比較をサポートしています。比較はこのコードで定義されます:(s, d) => s == d。
ソースコードはGitHubにあります。
Author: Chuck Conway is an AI Engineer with nearly 30 years of software engineering experience. He builds practical AI systems—content pipelines, infrastructure agents, and tools that solve real problems—and shares what he’s learning along the way. Connect with him on social media: X (@chuckconway) or visit him on YouTube and on SubStack.
著者: Chuck Conwayは、ソフトウェアエンジニアリングの経験が30年近くあるAIエンジニアです。彼は実用的なAIシステム(コンテンツパイプライン、インフラストラクチャエージェント、実際の問題を解決するツール)を構築し、学んだことを共有しています。ソーシャルメディアで彼とつながってください: X (@chuckconway) または YouTube と SubStack で彼を訪問してください。