さて、プロジェクションを実行するためList<int>
に使用すると、の作成は簡単です。Select
List<int> activeIds = people.Where(p => p.IsActive)
.Select(p => p.ID)
.ToList();
ただし、それを実行してからを使用するのではなくContains
、結合を実行します。
var activePeople = people.Where(p => p.IsActive);
var query = from person in otherList
join activePeople on person.ID equals activePeople.ID
select person;
または、のHashSet<int>
代わりにを作成しList<int>
て、Contains
チェックをより効率的にします。
var activeIds = new HashSet<int>(people.Where(p => p.IsActive)
.Select(p => p.ID));
var query = otherList.Where(t => activeIds.Contains(t.ID))
.ToList();
これらは両方とも、リストを作成してそれをContains
チェックに使用するO(M * N)ではなく、すべての一致を見つけるためのO(M + N)の複雑さを与えます。
もちろん、それはContains
チェックがインプロセスで行われることを前提としています。これが実際にLINQtoSQLクエリで使用される場合は、aを渡すだけで問題ない可能性List<int>
があります。または、結合によってすべてをデータベースで実行できる可能性があります。良いアドバイスを提供するには、もっと多くのコンテキストが本当に必要ですが、「これが私が構築できる方法であるため、完了です」だけにとどまらないでください。List<T>