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

时间:2009-07-20 15:43:43

标签: c# list

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

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

foreach(Item item in itemsToBeRemoved)
{
   myList.Remove(item);
}

有没有更好的方法呢?

7 个答案:

答案 0 :(得分:21)

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

myList.RemoveAll(IsMatching);

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

答案 1 :(得分:12)

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

答案 2 :(得分:2)

使用Linq有点改进。

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

答案 3 :(得分:1)

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

List<Item> itemsTaken = new List<Item>();
foreach(Item item in myList)
{
   if (!IsMatching(item)) itemsTaken.Add(item);
}

// use itemsTaken as if it were myList with items removed

答案 4 :(得分:1)

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

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

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

答案 5 :(得分:0)

类似于Jakers所说的,假设你在.Net 3:

myList = myList.Where(item => !IsMatching(item)).ToList();

答案 6 :(得分:0)

foreach(Item singleItem in new List<Item>(allItems))
{
  if(IsMatching(singleItem))
     allItems.Remove(singleItem);
}