C# LINQ 筛选 IEnumerable<IX> 并表示为 IEnumerable<X :IX>

标签 c# linq interface casting ienumerable

显然不可能转换 WhereEnumerableIterator<IX>IEnumerable<X:IX>

public interface IX 

public class X1 : IX 
public class X2 : IX

public void Method1(IEnumerable<IX> arg)
{
    var filtered = arg.Where(e => e.GetType() == typeof(X2));
    // filtered will be of type WhereEnumerableIterator<IX>
    Method2(filtered as IEnumerable<X2>);
}

public void Method2(IEnumerable<X2> arg) 
{
    // at runtime arg will be null
}

显然 CLR 无法转换 WhereEnumerableIterator<IX>IEnumerable<X2>并将结果设置为 null(有点神秘)。

过滤器可以应用于 IEnumerable<IX> 似乎合乎逻辑。结果表示为IEnumerable<X:IX> (实际上没有列举)。

但是如何做到这一点?

最佳答案

它发生了,因为 filteredIEnumerable<IX> (即使过滤后它只包含 X2 的项目)并且不能直接转换为 IEnumerable<X2> .
你可以这样做并转换你的 IEnumerable :

var filtered = arg.Where(e => e.GetType() == typeof(X2)).Cast<X2>();
// filtered will be of type WhereEnumerableIterator<X2> now
Method2(filtered);

但是你可以只使用 Enumerable.OfType 过滤 IEnumerable基于其元素的类型:

public void Method1(IEnumerable<IX> arg)
{
    var filtered = arg.OfType<X2>();
    Method2(filtered);
}

public void Method2(IEnumerable<X2> arg) 
{

}

关于C# LINQ 筛选 IEnumerable<IX> 并表示为 IEnumerable<X :IX>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54471250/

相关文章:

java - 隐藏接口(interface)后面的多个(给定)实现

java - 接口(interface)的多态性是否合法,就像抽象类的多态性是合法的一样吗?

c# - 如何在恰好午夜时在 Datagridview 单元格中显示完整的 DateTime 值?

c# - 使用 LINQ 对 XML 进行排序

c# - LightSwitch -- 无法确定目标数据库架构提供程序

c# - 在 linq c# 中使用 left 和 charindex

c# - LINQ 预加载 |找不到方法 "include"

java - 用户定义的接口(interface)与内置接口(interface)

c# - 如何使用公共(public)跟踪标识?

c# - 如何读取 RESX 文件值字段中的文件名