C#中的匿名函数、lambda表达式解读
在C#中,匿名函数和lambda表达式提供了更强大、更简洁的代码实现方式,这两个概念通常都是一起出现的。
匿名函数
匿名函数就是没有名字的函数,在C#中可以使用delegate来定义。匿名函数主要有以下两种形式:
delegate (parameters) { statements }
delegate { statements }
第一种形式的匿名函数,可以像普通函数一样传递参数和返回值。例如:
Action<int> printInt = delegate (int a) { Console.WriteLine(a); };
printInt(3); // 输出 3
第二种形式的匿名函数不需要传递参数和返回值。例如:
Action greet = delegate { Console.WriteLine("Hello"); };
greet(); // 输出 Hello
Lambda表达式
Lambda表达式是一种精简版的匿名函数,通常是以=>符号分割的参数列表和执行代码体组成。
(parameters) => expression
(parameters) => { statements }
Lambda表达式同样支持传递参数和返回值。例如:
Action<int> printInt = a => Console.WriteLine(a);
printInt(3); // 输出 3
Func<int, int> square = x => x * x;
Console.WriteLine(square(3)); // 输出 9
Lambda表达式也可以在LINQ查询语句中使用,实现快速筛选和排序等操作。例如:
var nums = new List<int> { 3, 6, 1, 8, 2 };
var sortedNums = nums.OrderBy(x => x);
Console.WriteLine(string.Join(", ", sortedNums)); // 输出 1, 2, 3, 6, 8
Lambda表达式还可以与委托、事件等高级概念相结合,进一步提升C#编程效率和代码可读性。
示例说明
示例1:按照姓氏首字母排序
例如有一个Person类:
class Person
{
public string Name { get; set; }
public int Age { get; set; }
public Person(string name, int age)
{
Name = name;
Age = age;
}
}
现在需要按照每个人的姓氏首字母进行升序排序。可以使用LINQ和Lambda表达式来实现:
var people = new List<Person>
{
new Person("Tom Smith", 27),
new Person("Alice Johnson", 31),
new Person("Bob Wilson", 22),
new Person("John Doe", 35)
};
var sortedPeople = people.OrderBy(p => p.Name.Split()[1][0]);
foreach (var person in sortedPeople)
{
Console.WriteLine(person.Name);
}
只需要一行代码就可以实现排序功能。使用OrderBy
方法和Lambda表达式,将每个Person的Name属性拆成两个部分:FirstName和LastName。通过姓氏的首字母进行升序排列。
示例2:计算数组中奇数的数量
例如有一个整数数组:
var nums = new[] { 3, 6, 1, 8, 2 };
现在需要计算这个数组中奇数的数量。可以使用Lambda表达式和Count
方法来实现:
var oddCount = nums.Count(n => n % 2 != 0);
Console.WriteLine("Odd count: " + oddCount);
只需要一行代码就可以完成计算功能。使用Count
方法和Lambda表达式,筛选出数组中为奇数的元素,并统计数量。
以上两个示例展示了匿名函数和Lambda表达式的一些基本应用方式,并且与其他C#高级概念结合实现了不同的功能。通过这些示例,可以更好地理解这两个概念的使用方法和实现原理。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#中的匿名函数、lambda表达式解读 - Python技术站