如何从哈希集中获取c#中属于特定子类的所有元素?

如何从哈希集中获取c#中属于特定子类的所有元素?,c#,C#,假设我们有动物、狗和猫的课程。狗和猫都是动物 public class Animal{} public class Dog : Animal{} public class Cat : Animal{} 然后,我们制作一组动物,并在其中填充猫和狗 HashSet<Animal> animals = new HashSet<Animal>(); animals.Add(new Dog()); animals.Add(new Cat()); anima

假设我们有动物、狗和猫的课程。狗和猫都是动物

public class Animal{}  
public class Dog : Animal{}  
public class Cat : Animal{}  
然后,我们制作一组动物,并在其中填充猫和狗

HashSet<Animal> animals = new HashSet<Animal>();  
animals.Add(new Dog());  
animals.Add(new Cat());  
animals.Add(new Dog());  
animals.Add(new Cat());  
HashSet-animals=new HashSet();
添加(新狗());
添加(新的Cat());
添加(新狗());
添加(新的Cat());

获取hashset动物中包含的所有狗(除了狗以外什么都没有)的hashset或列表的最佳方法是什么?

您可以使用LINQ

var dogs = animals.Where(x => x.GetType() == typeof(Dog)).ToList();
或更短,并且具有空处理

var dogs = animals.Where(x => x is Dog).ToList();

您可以为此使用LINQ

var dogs = animals.Where(x => x.GetType() == typeof(Dog)).ToList();
或更短,并且具有空处理

var dogs = animals.Where(x => x is Dog).ToList();

您只能在
哈希集中搜索精确相等,而不能搜索“类似”。。。因此,您必须枚举所有的
哈希集
比如
var dogs=animals.Where(x=>x是Dog)
animals.Where(x=>x.GetType()==typeof(Dog))
或:
动物。of type()
@Juraboros你想做什么?如果您想根据项目的类型处理所有项目,那么使用一个简单的循环和一点模式匹配是很简单的。如果您只想处理猫或狗,那么您必须遍历所有内容或使用不同的容器。这样的要求是相当不寻常的。即使是
OfType()
也会将该类型作为过滤器应用于源代码。您可以在
哈希集中搜索,仅查找精确的相等性,而不是“类似于”。。。因此,您必须枚举所有的
哈希集
比如
var dogs=animals.Where(x=>x是Dog)
animals.Where(x=>x.GetType()==typeof(Dog))
或:
动物。of type()
@Juraboros你想做什么?如果您想根据项目的类型处理所有项目,那么使用一个简单的循环和一点模式匹配是很简单的。如果您只想处理猫或狗,那么您必须遍历所有内容或使用不同的容器。这样的要求是相当不寻常的。即使是
OfType()
也会将类型作为过滤器应用于源代码。这两行代码之间有两个细微的区别
null
处理,如果有
类Bulldog:Dog{}
of type()
@xanatos,那么第二行的null处理更好。斗牛犬是狗,不是吗?;)只要Juraboros没有斗牛犬或暹罗猫,我们就不应该让它变得更复杂。@MightyBadaboom当你写两个解决方案,然后写“或更短”时,你就意味着等价。我不认为他们错了。它们都是正确的(就像类型()的
.OfType()
),但在许多情况下,如果你不只是养狗和猫,它们会有细微的不同。第一个解决方案是
=
,第二个解决方案是
=
。没有人会说
==
=
是一样的,我完全同意你的观点,这就是我编辑我文章的原因。忘记了空处理。这两行之间有两个细微的区别
null
处理,如果有
类Bulldog:Dog{}
of type()
@xanatos,那么第二行的null处理更好。斗牛犬是狗,不是吗?;)只要Juraboros没有斗牛犬或暹罗猫,我们就不应该让它变得更复杂。@MightyBadaboom当你写两个解决方案,然后写“或更短”时,你就意味着等价。我不认为他们错了。它们都是正确的(就像类型()的
.OfType()
),但在许多情况下,如果你不只是养狗和猫,它们会有细微的不同。第一个解决方案是
=
,第二个解决方案是
=
。没有人会说
==
=
是一样的,我完全同意你的观点,这就是我编辑我文章的原因。忘记了空处理。