IEnumerableコレクションが2つあります。
IEnumerable<MyClass> objectsToExcept
そして
IEnumerable<MyClass> allObjects.
objectsToExcept
には、allObjects
のオブジェクトが含まれる場合があります。
allObjects
のobjectsToExcept
オブジェクトから削除する必要があります。例えば:
foreach (var myClass in objectsToExcept)
{
allObjects.Remove(myClass);
}
または
allObject.Except(objectsToExcept)
しかし、それは機能しません。メソッドが実行された後のカウントは、アイテムが削除されていないことを示します。
最初のバージョンがどのようにコンパイルされるかわかりません。結果を使用しない限り、2番目のバージョンは何もしません。既存のコレクションからは何も削除されません-実際、beをサポートするメモリ内コレクションさえ存在しない場合があります。それは単に繰り返されたときに適切な値を返すシーケンスを返します。
areの場合、結果を使用します。
IEnumerable<MyClass> others = allObjects.Except(objectsToExcept);
foreach (MyClass x in others)
{
...
}
それで問題ないはずですifGetHashCode
とEquals
をオーバーライドしましたまたは参照の等式を使用したい場合。論理的に等しい値を削除しようとしているか、同じreferencesが両方のシーケンスで発生していますか? GetHashCode
とEquals
をオーバーライドしましたか?オーバーライドした場合、それらの実装が動作することを確認しますか?
基本的には問題ないはずです-問題を示す短いが完全なプログラムを作成することをお勧めします。そうすることで、何が間違っているのかがわかると思います。
IEnumerable<T>
にはRemove
メソッドはありません。これは、変更可能であることを意図していないためです。
Except
メソッドは元のコレクションを変更しません:除外されたアイテムを含まない新しいコレクションを返します:
var notExcluded = allObjects.Except(objectsToExcept);
[〜#〜] msdn [〜#〜] のExcept
を参照してください。
RemoveおよびExceptは、元のIEnumerableを変更しません。彼らは新しいものを返します。試してみる
var result = allObject.Except(objectsToexcept);
他の答えは正しいですが、Except()
呼び出しの結果を元の変数に割り当てることができることを追加する必要があります。あれは、
_allObjects = allObjects.Except(objectsToExcept);
_
また、Except()
は2つのコレクションのセットの差を生成するため、削除する変数の重複がある場合、それらはすべて削除されることに注意してください。
others.Where(contract => !objectsToExcept.Any()).ToList();