2012-03-09 11 views

答えて

6

DaveShawのanswerは、小さな配列を扱っても問題ありません。 IDの配列が大きくなる場合は、HashSet<T>に配列をロードし、セットを使用する以外は全く同じクエリを実行する方が効率的です。このおよび他のより複雑なシナリオについては

var hashset = new HashSet<int>(ints); 
var matches = objects.Where(obj => hashset.Contains(obj.Id)); 

、あなたはまた、約Enumerable.Joinキーに基づいて二つの配列と一致し、望ましい結果をもたらすことを知っている必要があります。

var matches = from obj in objects 
       join id in ints 
       on obj.Id equals id 
       select obj; 
// var matches = objects.Join(ints, obj => obj.Id, id => id, (obj, id) => obj); 
2

Idプロパティを持つクラスのインスタンスのリストがobjectsをされると仮定すると、あなたはこのようにそれを行うことができます。

var ints = new[] {1, 2, 3, }; 
var matches = ints.Intersect(objects.Select(obj => obj.Id)); 

これはint型にオブジェクトを投影し、その後、交差Set操作を実行します。

var ints = new[] {1, 2, 3, }; 
var matches = objects.Where(obj => ints.Contains(obj.Id)); 
-1

the where approachする代わりに、このようなものかもしれません。ちょうど別のアプローチ。

+1

これは、オブジェクトのコレクションではなく、IDのコレクションを返しますか? – Henry

+0

woops。質問を間違えたあなたが正しい。 – Foo42

+0

また、配列の.Contains()は結果に新しいSetを作成する必要がないため、.Intersect()より効率的でなければなりません。 – DaveShaw