少于 1 分钟阅读 次阅读

在 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# 代码的可读性与安全性。

标签:

分类:

更新时间:

留下评论