2011-10-03 24 views
7

私は数日間そのようなものを探していました。私は大きなリストAからリストBに従ってすべての要素を削除しようとしています。別のリストからオブジェクトのリストを削除する

IDSの異なる100個の要素で一般的なリストが得られ、10個のレコードで特定の要素を持つ別のリストが得られるとします。 2番目のリストの中に存在しない最初のリストからすべての要素を削除する必要があります。

私はコードが実際にどのように動作していないのかわからないことを示すようにしようとします。

List<Obj> listA = new List<Obj>(); 
List<Obj> listB = new List<Obj>(); 

//here I load my first list with many elements 
//here I load my second list with some specific elements 

listA.RemoveAll(x => !listB.Contains(x)); 

私は理由を知りませんが、それは働いていません。 List<int>タイプでこの例を試してみると、うまく動作しますが、私はそのオブジェクトでそれをしたいと思います。このオブジェクトにはIDがありますが、LINQ文内でこのIDを使用する方法はわかりません。あなたがIDを比較する必要が

+1

両方のリストに同じオブジェクト(同じクラスの別のインスタンスである可能性がありますが、同じデータが含まれている可能性があります)が含まれているため、問題はContainsです。 – HiperiX

+0

System.Objectから継承したメソッドの代わりにIDフィールドを使用するには、Obj型のEquals/GetHashcodeをオーバーライドしましたか? –

+0

オブジェクトのタイプは同じですが内容は異なりますが、IDとオブジェクト全体を比較するだけでした。ちょうどIAbstract〜の答えに従って、魅力的に働いた...ありがとう、みんな! –

答えて

20

listA.RemoveAll(x => !listB.Any(y => y.ID == x.ID)); 

List(T).RemoveAll

+0

チャームのように働いた!!皆さん、助けをありがとう! –

+0

RemoveAll拡張メソッドの名前空間は何ですか?私はそれを持っていない。 – Arash

+0

Arash、Listの一部です。あなたがIEnumerableの.ToList()を呼び出す必要があるかもしれないと思います – Joe

0

MSDN(http://msdn.microsoft.com/en-us/library/bhkz42b3.aspx)上の文書によると、含まれていますがIEquatableのは、equalsメソッドを使用することができますので、平等を決定するために、デフォルト等値比較子を使用していますあなたのObjクラスで動作させるHiperiXは上記のref比較を述べています。私はあなたがこれを行うには除き拡張子を使用することができると信じてhttp://msdn.microsoft.com/en-us/library/ms131190.aspx

0

あなたが別のリスト(listA)からオブジェクトのリスト(listB)を削除したい場合は、Use:

listA = listA.Except(listB).ToList() 

IEnumerable<Obj>を変換するために、ToListメソッド()を使用することを忘れないでくださいList<Obj>になります。

関連する問題