この質問にはおそらく10個の重複がありますが、現在これを行っているよりも良い方法があるかどうか知りたいです. これは、違いを判断する方法を示すために使用している小さな例です。
//let t1 be a representation of the ID's in the database.
List<int> t1 = new List<int>() { 5, 6, 7, 8 };
//let t2 be the list of ID's that are in memory.
//these changes need to be reflected to the database.
List<int> t2 = new List<int>() { 6, 8, 9, 10 };
var hash = new HashSet<int>(t1);
var hash2 = new HashSet<int>(t2);
//determines which ID's need to be removed from the database
hash.ExceptWith(t2);
//determines which ID's need to be added to the database.
hash2.ExceptWith(t1);
//remove contents of hash from database
//add contents of hash2 to database
現在実行しなければならない 2 つの操作ではなく、1 つの操作で何を追加および削除するかを判断できるかどうかを知りたいです。この操作のパフォーマンスを向上させる方法はありますか? 実際のデータベースの状況では、数十万の ID があることに注意してください。
EDITまたは2番目の質問です。データベースで直接実行できるLINQクエリがあるので、IDの新しいリストを提供して、それ自体を自動的に削除/追加できますか? (mysqlを使用)
明確化 2 つの SQL クエリ (またはストアド プロシージャ) が必要であることはわかっています。問題は、リスト内の違いを 1 回のアクションで判断できるかどうか、およびこれよりも速く実行できるかどうかです。
EDIT2
SPFiredrake からのこの操作は、私のハッシュセット バージョンよりも高速であるように見えますが、データベースに追加するものと削除するものを決定する方法がわかりません。その情報を操作に含める方法はありますか?
t1.Union(t2).Except(t1.Intersect(t2))
EDIT3
気にしないでください、このステートメントには実際には実行が遅れるという問題があることを忘れていましたが、誰かが疑問に思っている場合に備えて、カスタム比較子と追加された変数を使用して、それがどのリストからのものであるかを決定することで、以前の問題を解決しました。