我正在開發Silverlight 2/3應用程序。我想使用List.RemoveAll(或者它的IList.RemoveAll?)並指定謂詞,以便我可以在一次掃描中從列表中移除一堆元素。儘管如此,Silverlight中似乎並不存在這個函數。我在這裏錯過了什麼嗎?有沒有其他方法同樣簡單?現在,我在foreach中手動迭代我的元素並保留第二個列表(因爲迭代時不能刪除),而且非常麻煩。列表<T> .RemoveAll不存在於Silverlight中?
回答
如果你真正需要的是訪問該子集,則有真的沒有理由去除,只是像這樣訪問子集:
而不是(可能:
List<string> subSet = l.RemoveAll (p => !p.StartsWith ("a"));
剛剛獲得逆:
List<string> l = new List<string>() { "a", "b", "aa", "ab" };
var subSet = l.Where (p => p.StartsWith ("a"));
OK,但要真正刪除它們(假設與上面相同的首發名單):
l.Where (p => p.StartsWith ("a")).ToList().ForEach (q => l.Remove (q));
。哪裏是IEnumerable的擴展方法,在System.Linq中。 所以只要你的列表是一個通用的IEnumerable(你已經添加了使用)它應該是可用的。
你可以使用LINQ像:
list = list.Where(predicate).ToList();
的另一種方法是刪除的元素在for循環中:
for (int i = list.Count - 1; i >= 0; --i)
if (predicate(list[i]))
list.RemoveAt(i);
我得到了一個編譯錯誤類似於: System.Collections.Generic.IList
@ ashes999:確保在源文件的頂部有一個'using System.Linq;'。另外,確保你的項目中引用了'System.Core'。我在Silverlight 3中測試了它,它應該可以工作。 – 2010-01-25 19:31:24
正是我想要的解決方案 - 使用System.Linq! – ashes999 2010-01-25 19:55:28
我與Mehrdad就此而言,一種擴展方法可以解決這個問題。給你的完整簽名,這裏是:
/// <summary>
/// Removes all entries from a target list where the predicate is true.
/// </summary>
/// <typeparam name="T">The type of item that must exist in the list.</typeparam>
/// <param name="list">The list to remove entries from</param>
/// <param name="predicate">The predicate that contains a testing criteria to determine if an entry should be removed from the list.</param>
/// <returns>The number of records removed.</returns>
public static int RemoveAll<T>(this IList<T> list, Predicate<T> predicate)
{
int returnCount = 0;
for (int i = list.Count - 1; i >= 0; --i)
{
if (predicate(list[i]))
{
list.RemoveAt(i);
returnCount++;
}
}
return returnCount;
}
- 1. C#列表<object> .RemoveAll() - 如何刪除列表的子集?
- 2. 列表(T)RemoveAll()不按預期工作......?
- 3. removeAll - 修改源列表
- 4. Matrix3DProjection存在於Silverlight中,但不存在於WPF中?
- 5. <p:pickList> RemoveAll按鈕不會清除
- 6. 從列表中刪除項目RemoveAll
- 7. 如何在列表中拋出異常<T> .RemoveAll方法移除Nothing?
- 8. 通用列表RemoveAll和lambda表達式
- 9. 「鍵列不存在於表中」
- 10. C#檢查值是否存在於列表<>或不是
- 11. ArrayList中的removeAll
- 12. 列表<T>不等於列表<T>?
- 13. DataForm是否存在於Silverlight 4中,或僅存在於Silverlight 3中?
- 14. Oracle SQL - 不存在 - 字符串不存在於值列表中
- 15. 的removeAll從列表原因java.lang.UnsupportedOperationException
- 16. 鏈接列表遞歸removeAll方法
- 17. Linq RemoveAll在集合內的列表中的謂詞條件
- 18. 如何在Silverlight中創建列表<T>?
- 19. 列_ID不存在雖然它存在於表中
- 20. Howto序列化Silverlight中的列表<T>?
- 21. 轉換列表<base>類列出在Silverlight
- 22. System.ArgumentException列<ColumnName>不屬於表
- 23. 列不存在於表中,其顯示模式中的列
- 24. SqlServerCe不存在於dll列表
- 25. 列表框在Silverlight
- 26. Silverlight列表框不刷新列表
- 27. Silverlight:「該名稱已存在於樹中」
- 28. 如何禁用和的addAll按鈕的removeAll <豐富:選擇列表> 4.1
- 29. 爲什麼列表<T> .RemoveAll類中的所有類<T>都需要變體形式的Predicate?
- 30. 選擇當存在於表<int>
p.S.從http://stackoverflow.com/questions/308466/how-to-modify-or-delete-items-from-an-enumerable-collection-while-iterating-throu – ashes999 2010-01-25 18:10:49