我有一些地方可以做这样的事情:
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;
}
}
}
有更好的方法吗?
答案 0 :(得分:3)
答案 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
代替Where
和Cast
部分。
var things = listOfBaseClasses.OfType<Thing>().ToList();
来自docs
OfType(IEnumerable)方法仅返回那些元素 可以强制转换为TResult类型的源。