簡體   English   中英

從IEnumerable <T>中刪除項目

[英]Remove items from IEnumerable<T>

我有2個IEnumerable集合。

IEnumerable<MyClass> objectsToExcept 

IEnumerable<MyClass> allObjects.

objectsToExcept可以含有從物體allObjects

我需要從allObjects對象中objectsToExcept 例如:

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

要么

allObject.Except(objectsToExcept)

但它不起作用。 方法執行后的計數表示沒有刪除任何項目。

我沒有看到第一個版本如何編譯,第二個版本將不會做任何事情,除非你使用結果。 它不會從現有集合中刪除任何東西-的確,甚至可能不是一個內存中的集合支持它。 它只返回一個序列,當迭代時,它將返回適當的值。

如果您正在使用結果,例如

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

如果你已經覆蓋了GetHashCodeEquals 或者你很樂意使用引用相等,那么應該沒問題。 您是否嘗試刪除邏輯上相等的值,或者兩個序列中是否都出現相同的引用 你有沒有覆蓋GetHashCodeEquals ,如果有的話,你確定這些實現有效嗎?

基本上它應該沒問題 - 我建議你嘗試創建一個簡短但完整的程序來演示問題; 我懷疑這樣做,你會發現什么是錯的。

IEnumerable<T>上沒有Remove方法,因為它不是可修改的。

Except方法不會修改原始集合:它返回一個不包含排除項的新集合:

var notExcluded = allObjects.Except(objectsToExcept);

請參閱MSDN上的“ Except ”。

刪除和除外不要修改原始的IEnumerable。 他們返回一個新的。 嘗試

var result = allObject.Except(objectsToexcept);

雖然其他答案是正確的,但我必須補充說,可以將Except()調用的結果分配回原始變量。 那是,

allObjects = allObjects.Except(objectsToExcept);

還要記住, Except()將產生兩個集合的集合差異,因此如果要刪除的變量重復,則將全部刪除它們。

others.Where(contract => !objectsToExcept.Any()).ToList();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM