FilterAndCast Linq扩展方法

时间:2014-03-20 15:05:34

标签: c# linq

我有一些地方可以做这样的事情:

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;
        }
    }
}

有更好的方法吗?

3 个答案:

答案 0 :(得分:3)

是的,只需使用OfType<T>

  

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

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

答案 1 :(得分:1)

而不是:

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;
}

答案 2 :(得分:1)

您可以使用Enumerable.OfType代替WhereCast部分。

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

来自docs

  

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