从包含多种类型的列表中删除特殊类型 C#

Removing special type from list that contains multiple types C#

我遇到的问题是我想从我的列表中删除包含 2 种不同类型的特定项目。无论我尝试什么,我都会得到错误,并且我可以使用类型,如果我创建一个 class 的新实例,它不会删除旧的。我真的被困在这里,我不知道我应该做什么。

private List<Toys> toys = new List<Toys>();
toys.Add(new Ball("red"));
toys.Add(new MouseToy("gray"));

public abstract class Toys {}    
public class Ball : Toys {}
public class MouseToy : Toys {}

//how do i remove only one of the types?
//beacuse this does not work witch is one of many things i tried
    foreach(var toy in toys){
       if (toy.GetType == Ball){
          toys.Remove(toy)
       }
     }

这几乎就是我用于列表的代码。

你可以这样做:

toys = toys.Where(toy=>!(toy is Ball)).ToList();

正如@Sefe 在评论中提到的(感谢):您可以使用

List<MouseToy> mouseToys =  toys.OfType<MouseToy>().ToList();

如果您可以,您的新 collection 将是 List<MouseToy> 而不是 List<Toys> 。如果你得到第三个 class CatToy 并且你仍然想要获得所有项目,但不是 Ball class

,那将不起作用

您的解决方案有两个问题:

  1. 您正在修改正在迭代的列表 foreach。这将导致 InvalidOperationException
  2. .GetType == Ball 不是这样的。请改用 is

试试这个:

foreach(var toy in toys.ToArray()){
   if (toy is Ball){
      toys.Remove(toy);
   }
}

您也可以使用 LINQ:

foreach(var toy in toys.OfType<Ball>().ToArray()){
  toys.Remove(toy);
}

您不能在遍历同一个列表时从列表中删除项目。您可以使用反向 for 循环(即循环降序):

for (int i = toys.Length - 1; i >= 0; i--)
{
    if (toys[i] is Ball)
    {
        toys.RemoveAt(i);
    }
}

...或者您可以使用 System.Linq 命名空间中定义的方法之一。 Maksim Simkin 展示了如何使用 Where 方法;您还可以使用 OfType and Except 方法:

toys = toys.Except(toys.OfType<Ball>())
           .ToList();