【问题标题】:FilterAndCast Linq Extension MethodFilterAndCast Linq 扩展方法
【发布时间】:2014-03-20 23:11:34
【问题描述】:

我在一些地方会做这样的事情:

var listOfBaseClasses = new List<BaseClass>() { ... }
var things = listOfBaseClasses
    .Where(t => t is Thing)
    .Cast<Thing>()
    .ToList()

我意识到这有点代码味道,这就是支持别人代码的生活。

我想创建一个扩展方法来组合 Where 和 Cast 扩展方法。这就是我目前所拥有的......

public static IEnumerable<TResult> FilterAndCast<TResult>(this IEnumerable source)
{
    if (source == null)
    {
        throw new ArgumentNullException("source");
    }

    foreach (var item in source)
    {
        if (item.GetType() == typeof(TResult))
        {
            yield return (TResult)item;
        }
    }
}

有没有更好的方法来做到这一点?

【问题讨论】:

    标签: c# linq


    【解决方案1】:

    是的,只需使用OfType&lt;T&gt;

    根据指定类型过滤 IEnumerable 的元素。

    var things = listOfBaseClasses.OfType<Thing>.ToList()
    

    【讨论】:

    • 看来我是唯一一个不知道 OfType 的人。我会选择你的,因为你是第一个。谢谢!
    【解决方案2】:

    您可以使用Enumerable.OfType 为您完成WhereCast 部分。

    var things = listOfBaseClasses.OfType<Thing>().ToList();
    

    来自docs

    OfType(IEnumerable) 方法只返回那些元素 可以转换为 TResult 类型的源。

    【讨论】:

      【解决方案3】:

      而不是这个:

      var things = listOfBaseClasses
      .Where(t => t is Thing)
      .Cast<Thing>()
      .ToList()
      

      你可以使用OfType方法:

      var things = listOfBaseClasses.OfType<Thing>().ToList();
      

      最初它使用is 运算符并像这样执行Cast

      foreach (object obj in source) 
      {
         if (obj is TResult) yield return (TResult)obj;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-03-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多