web-dev-qa-db-ja.com

IEnumerable <T>からアイテムを削除します

IEnumerableコレクションが2つあります。

IEnumerable<MyClass> objectsToExcept 

そして

IEnumerable<MyClass> allObjects.

objectsToExceptには、allObjectsのオブジェクトが含まれる場合があります。

allObjectsobjectsToExceptオブジェクトから削除する必要があります。例えば:

foreach (var myClass in objectsToExcept)
{
allObjects.Remove(myClass);
}

または

allObject.Except(objectsToExcept)

しかし、それは機能しません。メソッドが実行された後のカウントは、アイテムが削除されていないことを示します。

45
Maxim

最初のバージョンがどのようにコンパイルされるかわかりません。結果を使用しない限り、2番目のバージョンは何もしません。既存のコレクションからは何も削除されません-実際、beをサポートするメモリ内コレクションさえ存在しない場合があります。それは単に繰り返されたときに適切な値を返すシーケンスを返します。

areの場合、結果を使用します。

IEnumerable<MyClass> others = allObjects.Except(objectsToExcept);
foreach (MyClass x in others)
{
    ...
}

それで問題ないはずですifGetHashCodeEqualsをオーバーライドしましたまたは参照の等式を使用したい場合。論理的に等しい値を削除しようとしているか、同じreferencesが両方のシーケンスで発生していますか? GetHashCodeEqualsをオーバーライドしましたか?オーバーライドした場合、それらの実装が動作することを確認しますか?

基本的には問題ないはずです-問題を示す短いが完全なプログラムを作成することをお勧めします。そうすることで、何が間違っているのかがわかると思います。

58
Jon Skeet

IEnumerable<T>にはRemoveメソッドはありません。これは、変更可能であることを意図していないためです。

Exceptメソッドは元のコレクションを変更しません:除外されたアイテムを含まない新しいコレクションを返します:

var notExcluded = allObjects.Except(objectsToExcept);

[〜#〜] msdn [〜#〜]Exceptを参照してください。

29
Thomas Levesque

RemoveおよびExceptは、元のIEnumerableを変更しません。彼らは新しいものを返します。試してみる

var result = allObject.Except(objectsToexcept);
16
Mike Two

他の答えは正しいですが、Except()呼び出しの結果を元の変数に割り当てることができることを追加する必要があります。あれは、

_allObjects = allObjects.Except(objectsToExcept);
_

また、Except()は2つのコレクションのセットの差を生成するため、削除する変数の重複がある場合、それらはすべて削除されることに注意してください。

4
lordcheeto
others.Where(contract => !objectsToExcept.Any()).ToList();
0
MikroDel