linq lamda表达式 single和first

本文介绍如何使用Linq Lambda表达式与Single操作符从数组中检索特定元素,并对比First及FirstOrDefault操作符的不同应用场景。
让我们来看看如何对一个整数数组使用 Single 操作符。这个整数数组的每个元素代表 2 的 1 到 10 次方。先创建此数组,然后使用 Single 操作符来检索满足 Linq Lambda表达式中指定条件的单个整数元素:
  1. int[] nums = { 1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024 };  
  2. int singleNum = nums.Single(x => x > 16 && x < 64);  
  3. Console.WriteLine(singleNum.ToString()); 

Linq Lambda表达式包含多个关键部分。Linq Lambda表达式首先定义传入委托的变量。在以上代码示例中,x(在 => 操作符左侧声明)是参数,代表传递给它的 nums 数组中的每个元素。Linq Lambda表达式的剩余部分代表数组中每个元素的评估逻辑。可使用匿名委托轻松地重新编写以上表达式,如下所示:

  1. int singleNum = nums.Single<int>(  
  2. delegate(int x) {return (x > 16 && x < 64); }  
  3. ) ; 

但是,此代码的可读性不及 Linq Lambda表达式。C# 2.0 引入了可使委托的传递稍微轻松些的匿名委托;但是,Linq Lambda表达式的简洁语法可使其更加简单。

First和Single

如 果必须从序列中提取一个值,First、FirstOrDefault、Single 和 SingleOrDefault 操作符都非常有用。First 方法返回序列中的第一个元素。First 有一个重载方法,可使用它来传入 Linq Lambda表达式来代表一个条件。例如,如果要返回整数序列中整数元素大于 50 的第一个元素,可使用以下代码示例:

  1. int[] nums = { 1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024 };  
  2. int num1 = nums.First<int>();  
  3. int num2 = nums.First<int>(x => x > 50);  
  4. int num3 = nums.FirstOrDefault<int>(x => x > 5000);  
  5.  
  6. Console.WriteLine(  
  7. num1.ToString() + "-" +   
  8. num2.ToString() + "-" +   
  9. num3.ToString()); 

此 代码会查找第一个元素 (1)、大于 50 的第一个元素 (64) 以及大于 5,000 的第一个元素。由于数组中没有元素满足第三个 Linq Lambda表达式(数组中无整数大于 5,000),则如果代码使用的是 First 操作符而非 FirstOrDefault,则会引发异常。在使用 FirstOrDefault 操作符时,如果没有元素满足 Linq Lambda表达式,则会返回 0。First 操作符也可用于 LINQ to Entities 查询,如下所示:

  1. using (Entities entities = new Entities())  
  2. {  
  3. var query = (from c in entities.Customers  
  4. select c).First(c => c.City.Equals("London"));  
  5. Console.WriteLine(query.CompanyName);  

在此示例中,将返回 London 城中的第一个客户。正如您所看到的,当 First 方法用于各种 LINQ 提供程序(在本例中为 LINQ to Objects 和 LINQ to Entities)时,所用的语法并不会更改。

### 区别分析 在 C# 中,匿名函数 Lambda 表达式都用于创建没有名称的函数,但它们在语法使用上存在显著差异。匿名函数通常使用 `delegate` 关键字定义,而 Lambda 表达式则采用更简洁的 `=>` 符号表示[^1]。Lambda 表达式不仅语法更加简洁,而且与委托或事件的配合使用方式相同,这使得它们在某些场景下更为方便。 ### 使用场景对比 Lambda 表达式特别适合用于需要简短、内联函数的地方,尤其是在 LINQ 查询中,它们能够显著减少代码量并提高可读性[^4]。例如,当需要对集合进行筛选、转换或聚合操作时,Lambda 表达式是理想的选择。以下是一个使用 `Func` `Action` 的 Lambda 表达式示例: ```csharp using System; class Program { static void Main() { // Func<int, int> 表示一个接受int参数并返回int结果的函数 Func<int, int> f1 = (int a) => { return a + a; }; Console.WriteLine(f1(7)); // 输出7+7=14 // Action<int> 表示一个接受int参数但没有返回值的函数 Action<int> a1 = (int a) => { Console.WriteLine(a + a); }; a1(8); // 输出8+8=16 } } ``` 相比之下,局部函数(Local Functions)则更适合于那些需要在某个方法内部多次调用的场景。局部函数不仅可以提高代码的可读性维护性,还能访问外部方法的变量,从而实现更复杂的逻辑[^2]。 ### 选择建议 在实际编程过程中,选择使用 Lambda 表达式还是局部函数应基于具体需求。如果函数逻辑简单且仅需一次使用,Lambda 表达式将是更好的选择。然而,如果函数逻辑复杂或需要多次调用,则应考虑使用局部函数[^2]。 此外,Lambda 表达式还支持无参无返回值的情况,如以下示例所示: ```csharp Action action = () => { Console.WriteLine("这是一个Lambda表达式的"); }; action(); ``` 通过上述对比,可以看出 Lambda 表达式匿名函数各有优势,开发者应根据实际应用场景灵活选择[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值