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

C#中,FirstOrDefault

在C#中,FirstOrDefault是LINQ中常用的扩展方法,用于从集合中获取第一个元素或默认值。
方法定义与重载

1、FirstOrDefault方法有多个重载版本:

    FirstOrDefault<TSource>(IEnumerable<TSource>) - 返回序列中的第一个元素,如果序列为空则返回默认值
FirstOrDefault<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>) - 返回满足条件的第一个元素,无匹配时返回默认值
FirstOrDefault<TSource>(IEnumerable<TSource>, TSource) - 返回序列的第一个元素,如果序列为空则返回指定的默认值
FirstOrDefault<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>, TSource) - 返回满足条件的第一个元素,无匹配时返回指定的默认值

2、与First()的区别

First()和FirstOrDefault()的核心区别在于处理空集合时的行为:

    ‌First()‌:序列为空或没有匹配元素时抛出InvalidOperationException
‌FirstOrDefault()‌:序列为空或没有匹配元素时返回默认值

3、使用示例
基本用法
List<int> numbers = new List<int> { 1, 2, 3, 4, 5 };

// 获取第一个元素
int first1 = numbers.First(); // 1
int first2 = numbers.FirstOrDefault(); // 1

// 获取第一个偶数
int firstEven1 = numbers.First(n => n % 2 == 0); // 2
int firstEven2 = numbers.FirstOrDefault(n => n % 2 == 0); // 2

空集合处理

csharpCopy Code
List<int> emptyList = new List<int>();

// First() 抛出异常
try {
int item = emptyList.First(); // InvalidOperationException
} catch (Exception ex) {
Console.WriteLine(ex.Message);
}

// FirstOrDefault() 返回默认值
int defaultItem = emptyList.FirstOrDefault(); // 0

4、引用类型示例
List<string> names = new List<string> { "Alice", "Bob" };

string firstLongName1 = names.First(n => n.Length > 10); // 抛出异常
string firstLongName2 = names.FirstOrDefault(n => n.Length > 10); // null

默认值规则

FirstOrDefault返回的默认值遵循以下规则:

    ‌引用类型‌:null
‌数值类型‌:0 / false
‌结构体‌:default(TSource)

5、使用场景选择
使用First()的场景

    确定集合非空(如硬编码的固定集合)
确保至少有一个匹配项(如业务逻辑要求必须存在)

使用FirstOrDefault()的场景

    不确定集合是否为空
查询结果可能没有匹配项
需要避免异常影响程序流程

6、性能考虑

在某些场景下,对于特定类型的集合(如List<T>),使用Find方法可能比FirstOrDefault有更好的性能表现,特别是在集合元素较少且需要谓词匹配时。
与其他方法的比较

    ‌与SingleOrDefault的区别‌:SingleOrDefault要求集合中最多只有一个匹配元素,否则会抛出异常

    ‌与DefaultIfEmpty的区别‌:DefaultIfEmpty返回包含默认值的序列,而FirstOrDefault仅返回单个元素或默认值

FirstOrDefault因其安全性和灵活性,在C#开发中被广泛应用于数据库查询、集合处理等多种场景

http://www.dtcms.com/a/597862.html

相关文章:

  • 【INVSR 代码解析】encode_first_stage函数,以及一个知识点普通编码器与VAE编码器的区别
  • 面试题:说说Redis的三大问题和解决方案
  • 大型企业网站wordpress评论框制作
  • EtherCAT通信PDO和SDO的区别和使用
  • dedecms本地可以更换网站模板出现网站模板不存在3800给做网站
  • 漯河哪里做网站柳州市住房和城乡建设局网站首页
  • 50m专线做视频网站asp网络公司程序 网站公司企业建设源码 网站设计模板seo优化
  • 企业年底做网站的好处做正品的网站
  • LeetCode 84. 柱状图中最大的矩形(困难)
  • YOLOv2算法详解(下篇):细节打磨与性能突破的终极密码
  • 算法 day 51
  • BI二维数据可视化大屏升级三维可视化大屏:前端开发者下一个内卷赛道
  • 插补算法(逐点比较法)+PWM配置操作
  • 唐山网站制作app新郑市网站建设
  • 买完阿里云域名如何做网站网站商业授权
  • QEMU 使用 Open vSwitch网桥连接虚拟机网络
  • 充气泵方案:充气泵与汽车的关系
  • 北京P2P公司网站建设网站建设合同 模板 下载
  • 贴片机编程:提高生产效率与精度的关键技术 | 贴片机编程技巧与注意事项详解
  • 深度学习_三层神经网络传播案例(L0->L1->L2)
  • 营销类网站建设需要注意的问题国家信用信息公示系统官网山东
  • 第四章:C# 面向对象编程详解:从类与对象到完整项目实践
  • DDoS防护:为企业业务保驾护航的高可用盾牌
  • 企业产品做哪个网站推广好建筑培训课程有哪些
  • 模版 c++
  • LLaMA Factory微调大模型
  • UaGateway构建高可用OPC UA架构:实现冗余通信与数据聚合
  • Linux之vmlinux文件段布局和arm64 的链接脚本vmlinux.lds.S分析
  • C#6、三种主要的错误类型是什么
  • 使用Selenium进行网页自动化