在c#中从列表中选择指定的子类型

本文关键字:类型 选择 列表 | 更新日期: 2023-09-27 17:50:36

我有一个函数,当给定List<T>时,从中选择List<V>,使得V : T:

当前的实现是:

public List<V> Subset<T, V>(IEnumerable<T> exo)
    where V : class
    where V : T
{
    return exo.Where(elem => elem is V).Select(elem => elem as V).ToList();
}

虽然我觉得更简洁的东西应该工作,因为它是声明VT的子类:

// Does not comile: can not implicitly convert List<T> to List<V>
public List<V> Subset<T, V>(IEnumerable<T> exo) where V : T
{
    return exo.Where(elem => elem is V).ToList();
}

你能解释一下为什么它不能推断正确的类型,也许我目前的实现是最好的吗?

在c#中从列表中选择指定的子类型

您可以使用Enumerable。OfType,根据参数类型筛选序列:

return exo.OfType<V>().ToList();

为什么你的第二个代码不工作-它选择项目是V从序列,但结果类型仍然是T的列表。序列只是被某个谓词过滤(不管你在那里检查了什么——是V类型的项,或者可能是项不为空,或者其他一些条件)。你知道你检查了什么,但是编译器仍然把结果当作筛选过的基类对象的序列。

你不能从方法返回基类对象的列表,方法应该返回派生对象的列表。如果可能的话,那么您可以返回未经过滤的基类列表。