LINQ(Language-Integrated Query),让数据处理变得简单。
委托->lambda->LINQ
委托:
- 委托是可以指向方法的类型,调用委托变量时执行的就是变量指向的方法。
- .NET中定义了泛型委托Action(无返回值)和Func(有返回值),所以一般不用自行一委托类型。
- 委托变量不仅可以指向普通方法,还可以指向匿名方法。
Action f1 = delegate (int i, int j) { Console.WriteLine("aa");};
f1(); // 执行匿名函数
匿名方法也可以写成Lambda表达式的方式, 使用lambda表达式可以省略参数的数据类型,因为编译器能根据委托类型推断出参数的类型,而使用非lambda时不能省略参数的数据类型:
Action<int, int> f1 = (i, j) => {Console.WriteLine("aa");};
f1(1,2);
如果委托没有返回值,且方法体只有一行代码,那么lambda表达式可以省略大括号; 如果只有一个参数,参数的括号可以省略:
Action<int, int> f1 = (i, j) => Console.WriteLine("aa");
f1(1,2);
Action<int> f1 = i => Console.WriteLine(i*i);
f1(2);
如果委托有返回值,且方法体只有一行代码,那么可以省略方法体的{}以及return;如果只有一个参数,参数的括号可以省略:
Func<int, int, int> f2 = (i, j) => i + j;
f2(1, 2);
Func<int, int> f1 = i => i * i;
Console.WriteLine(f1(2));
使用LINQ需要引入包:using System.Linq; The most recent versions of .NET make use of implicit usings to add this directive as a global using, Older versions require you to add it in your source.
using System.Linq;
int[] nums = new int[] {1, 2, 5, 15, 23, 6, 22, 77};
IEnumerable<int> result = nums.Where(i => i > 10);
foreach (int i in result)
{
Console.WriteLine(i);
}
Where方法会遍历集合中每个元素,对于每个元素都调用i=> i>10这个表达式判断一下是否为true,如果为true,则把这个元素放到返回的集合中。
A LINQ data source is any object that supports the generic IEnumerable inerface, or an interface that inherits from it, typically IQueryable.
A query isn't executed unitl you iterate over the query variable, for example in a foreach statement. All the standard query operators that return a scalar result execute immediately, Examples of such queries are Count, Max, Average and First. These methods execute without an explicit foreach statement because the query itself must use foreach in order to return a result. You can force any query to execute immediately using the Enumerable.ToList or Enumerable.ToArray methods.
可以使用var让编译器的类型推断来简化类型声明,在LINQ中常用。C#的var和JavaScript中的var不一样,C#中仍然是强类型的。
- Where方法:每一项数据都会经过predicate的测试,如果针对一个元素,predicate执行的返回值为true,那么这个元素就会放到返回值中。Where参数是一个lambda表达式格式的匿名方法,方法的参数表示当前判断的元素对象。
- Count方法:获取数据条数。
- Any方法:判断是否有一条数据满足要求。
- Single方法:有且只有一条满足要求的数据,没有或者有多条满足的数据会抛异常。
- SingleOrDefault方法:最多只有一条满足要求的数据,有多条满足的数据会抛异常,没有满足的数据会返回默认值;
- First方法:至少有一条,返回第一条,一条满足的都没有就会报错;
- FirstOrDefault:返回第一条,一条满足的都没有就返回默认值;
- OrderBy方法:对数据正序排序,返回排序后的数据,原数据不受影响;
- OrderByDescending方法:对数据倒序排序;
- ThenBy方法,ThenByDescending方法:可以在OrderBy和OrderByDescending后继续写ThenBy、ThenByDescending,先按照排序方法排序,对于第一次排序条件相同的数据,继续按后续排序方法排序。
- Skip方法:跳过N条数据,如果数据不足N条,全部跳过;
- Take方法:获取N条数据, 如果数据不足N条,有多少取多少;
- 聚合函数:Max、Min、Average、Sum、Count
- 分组:GroupBy方法参数是分组条件表达式,返回值为IGrouping类型的泛型IEnumerable,也就是每一个组以一个IGrouping对象的形式返回。IGrouping是一个继承自IEnumerable的接口,IGrouping中Key属性表示这一组的分组数据的值。
- 投影:把集合中的每一项转换为另外一种类型,也可以是匿名类型,select方法。
- 集合转换:有一些地方需要数组类型或者List类型的变量,我们可以用ToArray方法和ToList分别把IEnumerable转化为数据类型和List类型。
LINQ大部分时间不会影响性能,面试时候的算法题一般尽量避免使用正则表达式、LINQ等这些高级的类库。
Top comments (0)