加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

C#LINQ过滤器IEnumerable并表示为IEnumerable

发布时间:2020-12-16 09:22:45 所属栏目:百科 来源:网络整理
导读:显然,无法转换WhereEnumerableIterator IX到IEnumerable X:IX public interface IX public class X1 : IX public class X2 : IXpublic void Method1(IEnumerableIX arg){ var filtered = arg.Where(e = e.GetType() == typeof(X2)); // filtered will be of
显然,无法转换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> (实际上没有枚举).

但是怎么做呢?

解决方法

它发生了,因为过滤的是IEnumerable< 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) 
{

}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读