从列表中删除匹配项的更好方法

在c#中,当我想从列表中删除一些项目时,我会按以下方式执行此操作,

List itemsToBeRemoved = new List(); foreach(Item item in myList) { if (IsMatching(item)) itemsToBeRemoved.Add(item); } foreach(Item item in itemsToBeRemoved) { myList.Remove(item); } 

有没有更好的方法呢?

好吧,你可以调用完全符合你想要的方法。

 myList.RemoveAll(IsMatching); 

通常,使用完全符合您想要的方法而不是自己重新发明它的方法“更好”。

 myList.RemoveAll(x=> IsMatching(x)); 

使用Linq有一点改进。

 var itemsToRemove = myList.Where(item => IsMatching(item)).ToList(); foreach(Item item in itemsToBeRemoved) { myList.Remove(item); } 

如何恢复逻辑,添加不匹配的项目,只使用结果集合?

 List itemsTaken = new List(); foreach(Item item in myList) { if (!IsMatching(item)) itemsTaken.Add(item); } // use itemsTaken as if it were myList with items removed 

我以前做的是创建一个反向for循环:

 for (int i=myList.Count-1; i>=0; i--) { if (IsMatching(myList[i])) myList.RemoveAt(i); } 

但我确信使用LINQ有更优雅的方式。

与Jakers所说的相似,假设你在.Net 3:

 myList = myList.Where(item => !IsMatching(item)).ToList(); 
 foreach(Item singleItem in new List(allItems)) { if(IsMatching(singleItem)) allItems.Remove(singleItem); }