【问题标题】:C# LINQ filter IEnumerable<IX> and express as IEnumerable<X:IX>C# LINQ 过滤 IEnumerable<IX> 并表示为 IEnumerable<X:IX>
【发布时间】:2019-02-01 00:29:58
【问题描述】:

显然不可能将WhereEnumerableIterator&lt;IX&gt; 转换为IEnumerable&lt;X:IX&gt;

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&lt;IX&gt; 转换为 IEnumerable&lt;X2&gt; 并将结果设置为 null(有点神秘)。

过滤器可以应用于IEnumerable&lt;IX&gt; 并且结果表示为IEnumerable&lt;X:IX&gt;(没有实际枚举)似乎是合乎逻辑的。

但是怎么做呢?

【问题讨论】:

  • 我认为您可以使用art.OfType&lt;X2&gt;() 根据其类型过滤IEnumerable
  • 扩展 Yeldar 的评论 .OfType&lt;X2&gt;() 将返回一个 IEnumerable&lt;X2&gt;,因此之后无需再进行任何转换。

标签: c# linq interface casting ienumerable


【解决方案1】:

它发生了,因为filteredIEnumerable&lt;IX&gt;(即使过滤后它只包含X2 的项)并且不能直接转换为IEnumerable&lt;X2&gt;
你可以这样做并投射你的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) 
{

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-27
    • 1970-01-01
    • 2017-08-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多