C# .OfType方法 —— 过滤转换列表元素
在 C# 中,.OfType<T>() 是 LINQ(语言集成查询)提供的一个非常高频且实用的扩展方法。它的核心功能是:从一个集合中筛选出指定类型的元素,并返回一个强类型的泛型集合。
当你需要处理包含多种不同类型对象的集合(即多态集合)时,这个方法是最佳选择。
1. 核心执行逻辑
当对一个集合调用 .OfType<T>() 时,它在底层的执行步骤如下:
- 逐一遍历:它会遍历原始集合(如
IEnumerable)中的每一个元素。 - 类型检查:对每个元素进行安全的类型判断(等效于 C# 中的
is运算符)。 - 安全跳过:如果元素不是目标类型
T(或其子类),它会直接跳过该元素,绝不会抛出异常。 - 转换并返回:如果元素符合目标类型
T,它会将其转换为T类型,并加入到最终返回的IEnumerable<T>结果集中。
2. 代码示例:直观对比
为了最直观地理解它的作用,我们来看一个包含混合数据类型的数组:
// 一个包含字符串、整数和浮点数的混合集合
object[] mixedCollection = { "Hello", 123, "World", 45.6 };
// 使用 OfType<string>() 只提取字符串
var stringList = mixedCollection.OfType<string>().ToList();
// 结果 stringList 包含: ["Hello", "World"]
// 整数 123 和浮点数 45.6 被安全地忽略了
代码实战:
var fiveGStep = testSteps.OfType<FiveGCheckStep>().FirstOrDefault();
这段代码的执行逻辑非常明确:在 testSteps 这个包含各种测试步骤的集合中,筛选出类型为 FiveGCheckStep 的对象。如果集合中不存在该类型的对象,OfType 会返回一个空集合,随后 FirstOrDefault() 会安全地返回 null。
3. 关键注意点:与 Cast() 的区别
在 LINQ 中,还有一个方法 .Cast<T>(),它的签名与 .OfType<T>() 相似,但行为截然不同。区分它们是写出健壮代码的关键:
OfType<T>()(过滤并转换):如果遇到类型不匹配的元素,直接忽略。适用于你不确定集合中所有元素的类型,且只关心特定类型时的场景。Cast<T>()(强制转换):它假设集合中的所有元素都可以转换为类型T。如果遇到任何一个类型不匹配的元素,程序会立即抛出InvalidCastException异常并崩溃。适用于你确信集合中所有元素的实际类型一致的场景。
总结:
.OfType<T>() 是处理多态集合时最安全、最简洁的方法,它将“类型过滤”和“类型转换”合二为一,极大地提升了 C# 代码的可读性与安全性。
留下评论