FilterAndCast Linq扩展方法

本文关键字:方法 扩展 Linq FilterAndCast | 更新日期: 2023-09-27 17:51:14

我有一些地方我这样做:

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

有更好的方法吗?

FilterAndCast Linq扩展方法

是的,就用OfType<T>:

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

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

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

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

OfType(IEnumerable)方法只返回数组中的元素可转换为result类型的源。

而不是:

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