我有一些地方我这样做:
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;
}
}
}
有更好的方法吗?
是的,就用OfType<T>
:
根据指定的类型过滤IEnumerable中的元素。
var things = listOfBaseClasses.OfType<Thing>.ToList()
您可以使用Enumerable.OfType
来完成Where
和Cast
部分。
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;
}