从包含多种类型的列表中删除特殊类型 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
,那将不起作用
您的解决方案有两个问题:
- 您正在修改正在迭代的列表
foreach
。这将导致 InvalidOperationException
。
.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();
我遇到的问题是我想从我的列表中删除包含 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
您的解决方案有两个问题:
- 您正在修改正在迭代的列表
foreach
。这将导致InvalidOperationException
。 .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();