私はintの配列とint IDを含むオブジェクトのリストを持っています。他のコレクションの値に基づくフィルタコレクション
intの配列に1,2,3などが含まれている場合、これらのIDを含むオブジェクトを取得したいだけです(1,2,3など)。
これは.NET 3.5でどのように行うことができますか?
おかげ
私はintの配列とint IDを含むオブジェクトのリストを持っています。他のコレクションの値に基づくフィルタコレクション
intの配列に1,2,3などが含まれている場合、これらのIDを含むオブジェクトを取得したいだけです(1,2,3など)。
これは.NET 3.5でどのように行うことができますか?
おかげ
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);
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));
the where approachする代わりに、このようなものかもしれません。ちょうど別のアプローチ。
これは、オブジェクトのコレクションではなく、IDのコレクションを返しますか? – Henry
woops。質問を間違えたあなたが正しい。 – Foo42
また、配列の.Contains()は結果に新しいSetを作成する必要がないため、.Intersect()より効率的でなければなりません。 – DaveShaw