[英]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)
{
...
}
如果你已經覆蓋了GetHashCode
和Equals
或者你很樂意使用引用相等,那么應該沒問題。 您是否嘗試刪除邏輯上相等的值,或者兩個序列中是否都出現相同的引用 ? 你有沒有覆蓋GetHashCode
和Equals
,如果有的話,你確定這些實現有效嗎?
基本上它應該沒問題 - 我建議你嘗試創建一個簡短但完整的程序來演示問題; 我懷疑這樣做,你會發現什么是錯的。
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.