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

时间:2017-01-30 19:43:40

标签: c# .net list subclass base-class

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

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)
       }
     }

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

3 个答案:

答案 0 :(得分:3)

你可以做到:

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

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

来做到更简单,更好
List<MouseToy> mouseToys =  toys.OfType<MouseToy>().ToList();

如果您的新收藏品为List<MouseToy>而不是List<Toys>,那么您可以。如果你得到第三课CatToy并且你仍然希望获得所有项目,而不是Ball课程

,那将无法奏效

答案 1 :(得分:1)

您的解决方案存在两个问题:

  1. 您正在修改使用foreach进行迭代的列表。这将导致InvalidOperationException
  2. .GetType == Ball不能像这样工作。请改用is
  3. 试试这个:

    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);
    }
    

答案 2 :(得分:1)

在迭代同一列表时,无法从列表中删除项目。您可以使用反向Check out this picture循环(即循环降序):

for

...或者您可以使用for (int i = toys.Length - 1; i >= 0; i--) { if (toys[i] is Ball) { toys.RemoveAt(i); } } 命名空间中定义的方法之一。 Maksim Simkin展示了如何使用System.Linq方法;您还可以使用OfTypeExcept方法:

Where