编辑
2025-02-08
C# 应用
00
请注意,本文编写于 87 天前,最后修改于 87 天前,其中某些信息可能已经过时。

目录

Single方法
示例
SingleOrDefault方法
示例
First方法
示例
FirstOrDefault方法
示例
方法选择指南
性能考虑
结论

在C#开发中,LINQ (Language Integrated Query) 为我们提供了强大的数据查询和操作能力。其中,Single、SingleOrDefault、First和FirstOrDefault是四个常用且容易混淆的方法。本文将深入探讨这些方法的特点、使用场景以及它们之间的区别,帮助您在实际编程中做出正确的选择。

Single方法

Single方法用于从序列中获取唯一满足指定条件的元素。它有两个重要的特性:

  1. 如果序列中没有元素满足条件,会抛出异常。
  2. 如果有多个元素满足条件,同样会抛出异常。

因此,Single方法适用于您确定序列中有且仅有一个元素满足条件的情况。

示例

C#
List<int> numbers = new List<int> { 1, 3, 5, 7, 9 }; // 正确使用:只有一个元素满足条件 int result = numbers.Single(n => n == 5); Console.WriteLine(result); // 输出: 5 // 错误使用:没有元素满足条件,会抛出异常 // int noResult = numbers.Single(n => n > 10); // 错误使用:多个元素满足条件,会抛出异常 // int multipleResults = numbers.Single(n => n > 3);

image.png

SingleOrDefault方法

SingleOrDefault方法与Single类似,但有一个重要区别:当没有元素满足条件时,它会返回该类型的默认值,而不是抛出异常。

示例

C#
List<string> fruits = new List<string> { "Apple", "Banana", "Cherry" }; // 正确使用:只有一个元素满足条件 string result = fruits.SingleOrDefault(f => f.StartsWith("B")); Console.WriteLine(result); // 输出: Banana // 正确使用:没有元素满足条件,返回默认值(null) string noResult = fruits.SingleOrDefault(f => f.StartsWith("D")); Console.WriteLine(noResult == null ? "No result" : noResult); // 输出: No result // 错误使用:多个元素满足条件,会抛出异常 // string multipleResults = fruits.SingleOrDefault(f => f.Length > 5);

image.png

First方法

First方法返回序列中满足指定条件的第一个元素。与Single不同,它不要求序列中只有一个满足条件的元素。

示例

C#
List<double> prices = new List<double> { 10.5, 20.3, 30.8, 15.2, 25.7 }; // 正确使用:返回第一个满足条件的元素 double result = prices.First(p => p > 20); Console.WriteLine(result); // 输出: 20.3 // 正确使用:多个元素满足条件,返回第一个 double firstLarge = prices.First(p => p > 15); Console.WriteLine(firstLarge); // 输出: 20.3 // 错误使用:没有元素满足条件,会抛出异常 // double noResult = prices.First(p => p > 100);

FirstOrDefault方法

FirstOrDefault方法与First类似,但当没有元素满足条件时,它会返回该类型的默认值,而不是抛出异常。

示例

C#
List<Person> people = new List<Person> { new Person { Name = "Alice", Age = 25 }, new Person { Name = "Bob", Age = 30 }, new Person { Name = "Charlie", Age = 35 } }; // 正确使用:返回第一个满足条件的元素 Person result = people.FirstOrDefault(p => p.Age > 28); Console.WriteLine(result?.Name); // 输出: Bob // 正确使用:没有元素满足条件,返回默认值(null) Person noResult = people.FirstOrDefault(p => p.Age > 40); Console.WriteLine(noResult == null ? "No result" : noResult.Name); // 输出: No result // 正确使用:多个元素满足条件,返回第一个 Person firstAdult = people.FirstOrDefault(p => p.Age >= 18); Console.WriteLine(firstAdult?.Name); // 输出: Alice

方法选择指南

为了帮助您在实际编程中选择合适的方法,这里提供一个简单的决策树:

  1. 您期望序列中有且仅有一个元素满足条件吗?
    • 是 -> 使用 Single
    • 否 -> 继续到步骤 2
  2. 您希望在没有匹配元素时返回默认值而不是抛出异常吗?
    • 是 -> 使用 SingleOrDefault
    • 否 -> 继续到步骤 3
  3. 您只需要第一个满足条件的元素吗?
    • 是 -> 使用 First
    • 否 -> 使用 FirstOrDefault

性能考虑

在选择这些方法时,还应考虑性能因素:

  • Single 和 SingleOrDefault 需要遍历整个序列以确保只有一个匹配元素。
  • First 和 FirstOrDefault 在找到第一个匹配元素后就会停止遍历。

因此,对于大型集合,如果您只需要第一个匹配元素,使用 First 或 FirstOrDefault 可能会更高效。

方法返回值无匹配时多个匹配时
Single唯一匹配的元素抛出异常抛出异常
SingleOrDefault唯一匹配的元素或默认值返回默认值抛出异常
First第一个匹配的元素抛出异常返回第一个匹配
FirstOrDefault第一个匹配的元素或默认值返回默认值返回第一个匹配

结论

理解 Single、SingleOrDefault、First 和 FirstOrDefault 这四个LINQ方法的区别和适用场景,对于编写高效、健壮的C#代码至关重要。通过正确选择和使用这些方法,您可以使您的LINQ查询更加精确和高效,同时减少潜在的运行时错误。在实际开发中,根据您的具体需求和数据特性,灵活运用这些方法,将会大大提高您的代码质量和可维护性。

本文作者:rick

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!