2016-12-21 12 views
3

ListのオブジェクトがlistAlistBの2つあり、コレクションにはUserオブジェクトが含まれています。両方のリストにあるオブジェクトを特定のコンパレータに基づいて取得する

UserオブジェクトのプロパティはIDです。

IDプロパティに基づいて、listAlistBの両方に存在するユーザーのリストを取得したいとします。ここで

は、これまでの私のコードです:

listA.Where(a => listB.Any(b => b.ID == a.ID)); 

はこれを行うには良い方法はありますか?特にlistBが大きい場合は、非効率的なように感じます。

UserオブジェクトにはIEquatableが実装されていません。

+1

はIDがユニークか?おそらくIDとしてキーとして代わりにHashSetを使用することができます。 – Equalsk

+0

IDは一意の 'Guid'オブジェクトです。 2つの 'User'オブジェクトが同じ' ID'を持っていれば、それらは同じです(ただし、直接等価ではありません)。 –

+0

次に、IDをキーとして2つのHashSetを作成し、表示したメソッドを使用してキーを比較します。あるいは、他の人が「Intersect()」が良いかもしれないと指摘しています。これはコメントだけをテストしていない。 – Equalsk

答えて

1

これはそれを行う必要があります:あなたのUserクラスは、これはあなたのケースではない場合、その後、あなたがベースの両方のリストを交差するために、そのn個の順序のような何かを行うことができますIEquatable<User>

を実装すると仮定すると

var result = listA.Intersect(listB); 

をID値:

var result = listA.Select(s1 => s1.ID).ToList().Intersect(listB.Select(s2 => s2.ID).ToList()).ToList(); 

これは両方のリストにID値の2つの新しいリストを作成し、交差点bを取得していますそれらの間に。

+1

'User'は' IEquatable 'を実装しなければなりません。そうでなければ、ユーザが異なるインスタンスであれば動作しません。 – Johnny

+0

@Lepijohnny:はい、私はそれを修正します。 –

2

UserIEquatable<User>を実装している場合、仮定はIDが同じである場合、あなたはLINQ Intersectを使用できるかどうか2 Userが同じであることです。たとえば:UserIEquatable<User>を実装していない場合は

listA.Intersect(listB); 

あなたはIEqualityComparer<User>Intersectを呼び出すことができます。たとえば、次のように

UserEqualityComparer : IEquatable<User> {...} 
+0

'User'は' IEquatable 'を実装していません。 –

1

別のオプションは、両方のコレクションのIDプロパティにJoinにある

listA.Intersect(listB, new UserEqualityComparer()); 

..

var results = listA.Join(listB, a => a.Id, b=> b.Id, (a, b) => a); 
関連する問題