当前位置: 首页 > article >正文

C#中LINQ的Cast<T>与OfType<T>

在C#中,Cast() 方法是LINQ(Language Integrated Query)的一部分,它位于 System.Linq 命名空间中。这个方法用于将 IEnumerable 集合(或任何实现了 IEnumerable 接口的集合)的元素转换为指定类型 T 的集合。这个过程实际上是尝试将每个元素视为类型 T,如果转换失败(比如,如果某个元素无法被强制转换为 T),则会抛出一个 InvalidCastException。

使用场景
当你有一个对象集合,并希望以强类型的方式处理这些对象时,Cast() 方法非常有用。这在你不能确定集合中所有元素都是特定类型但又需要按该类型处理它们时尤其有用。

示例
假设我们有一个 List,其中包含了一些字符串和整数,但我们只对字符串感兴趣。我们可以使用 Cast() 来尝试将集合转换为字符串集合,但需要注意,如果集合中包含非字符串元素,这将导致运行时错误。

using System;  
using System.Collections.Generic;  
using System.Linq;  
  
class Program  
{  
    static void Main()  
    {  
        List<object> objects = new List<object> { "Hello", 123, "World" };  
  
        try  
        {  
            // 尝试将 List<object> 转换为 List<string>  
            var strings = objects.Cast<string>().ToList();  
  
            // 这里不会执行,因为 Cast<string>() 会抛出 InvalidCastException  
            // 因为它试图将整数 123 转换为 string  
  
            foreach (var str in strings)  
            {  
                Console.WriteLine(str);  
            }  
        }  
        catch (InvalidCastException ex)  
        {  
            Console.WriteLine("无法将所有对象转换为字符串: " + ex.Message);  
        }  
  
        // 正确的做法是使用 OfType<T>(),它只会返回可以成功转换为 T 的元素  
        var safeStrings = objects.OfType<string>().ToList();  
  
        foreach (var str in safeStrings)  
        {  
            Console.WriteLine(str);  
        }  
    }  
}

在上面的示例中,尝试使用 Cast() 会导致 InvalidCastException,因为集合 objects 包含了一个整数,该整数无法转换为字符串。为了避免这种情况,我们可以使用 OfType() 方法,它只会返回那些可以成功转换为指定类型 T 的元素,而忽略那些不能转换的元素。


结论
Cast() 尝试将 IEnumerable 集合中的每个元素转换为类型 T。
如果任何元素无法转换为 T,则会抛出 InvalidCastException。
使用 Cast() 时要小心,确保集合中的所有元素都可以安全地转换为 T。
如果需要处理可能包含不同类型元素的集合,并只想获取那些可以转换为特定类型的元素,考虑使用 OfType() 方法。


http://www.kler.cn/a/294261.html

相关文章:

  • 4-6-2.C# 数据容器 - ArrayList 扩展(ArrayList 注意事项、ArrayList 存储对象的特性、ArrayList 与数组的转换)
  • Dolby TrueHD和Dolby Digital Plus (E-AC-3)编码介绍
  • Ruby编程语言全景解析:从基础到进阶
  • Pycharm PyQt5 环境搭建创建第一个Hello程序
  • 第三十六章 Vue之路由重定向/404页面设置/路径模式设置
  • Linux探秘坊-------1.系统核心的低语:基础指令的奥秘解析(1)
  • DevOps学习笔记
  • 基于SpringBoot+Vue+MySQL的校园周边美食探索及分享平台
  • 初识jQuery
  • Android 15 新特性快速解读指南
  • 使用bert_base_chinese实现文本语义相似度计算
  • Spring Boot-自定义banner
  • 视频提取字幕的软件有哪些?高效转录用这些
  • react的useRef作用是什么怎么使用
  • Android Camera系列(一):SurfaceView+Camera
  • 数据结构,单向链表
  • 【2024高教社杯全国大学生数学建模竞赛】B题完整解析(含论文、代码分享)
  • 7个 C# 高阶用法详解:从基础到实战
  • 微信小程序实践案例
  • Kafka Broker处于高负载状态(例如消息处理量大或系统资源不足),无法及时响应消费者的请求
  • 智能工厂程序设计 之1 智能工厂都本俱的方面(Facet,Aspect和Respect)即智能依赖的基底Substrate 之1
  • 机械学习—零基础学习日志(概率论总笔记4)
  • JAVA基础:JVM中方法的执行过程和方法的重载,递归,可变参数的含义
  • MySQL——视图(一)视图概述
  • 59.以太网数据回环实验(2)硬件资源梳理及系统框图
  • 桶排序【算法 14】