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、使用示例
(1)基本用法
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

(2)空集合处理
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仅返回单个元素或默认值
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值