2

最終結果は私が使いたいです.Where(t => someIntList.Contains(t.ID)).ToList()。作成に苦労していますsomeIntList

私がこれまでに持っているもの:List<Person> people = people.Where(p => p.isActive).ToList()。物件List<int>の一部を返却するにはどうすればよいですか?p.ID

または、Containsを実行する別の方法があります(すでに別の目的で使用されているComparerクラスを記述せずに)。

4

1 に答える 1

7

さて、プロジェクションを実行するため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>

于 2012-10-03T22:49:07.797 に答える