あなたが間違っている主なことは、結果を何かに割り当てないことです。そのため、元のクライアントはすべてのクライアントを保持しているように見えました。しかし、オリジナルを改善することはできます。
filteredClients = filteredClients.Where(n => !jobsToSearch.Any(j => j.Client == n.ClientId)).ToList();
.Count()
これとあなたのソリューションの違いは.Any()
、最初の一致に遭遇するとすぐに各クライアントでジョブ リストの参照を停止できるため、実行速度が少し速くなることです。しかし、まだ終わりではありません。ジョブリストを個別のクライアントのみに絞り込むことで、さらにうまくいくことができます。
var badClients = jobsToSearch.Select(j => j.Client).Distinct().ToList();
filteredClients = filteredClients.Where(n => !badClients.Any(j => j == n.ClientId)).ToList();
そして、Dcitionary のように O(1) ルックアップを作成できるHashSetを使用すると、おそらくさらに良いでしょう。クライアント ID が int であると仮定します。
var badClients = new HashSet<int>(jobsToSearch.Select(j => j.Client));
filteredClients = filteredClients.Where(n => !badClients.Contains(n.ClientId)).ToList();
この最後のオプションのパフォーマンスが向上するかどうかは、ジョブを持つクライアントの数に依存します...リストが短い場合でも、.Distinct() の方がパフォーマンスが向上する可能性があります。
最後に、通常、このような呼び出しはお勧めしません.ToList()
。リスト、配列、またはコレクション型を実際に実現することは可能な限り最後の瞬間まで保存し、できるだけ長く Enumerable に保持します。