
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にあります。
著者:Chuck Conwayはソフトウェアエンジニアリングと生成AIを専門としています。ソーシャルメディアで彼とつながりましょう:X (@chuckconway) または YouTube をご覧ください。