【C#】使用查询表达式的LINQ --《C#本质论》

查询表达式总是以from子句开始,以select子句或group by子句结束。

1、select 投射

查询表达式的select子句将from子句的表达式所收集到的东西投射到完全不同的数据类型中:

        var fileNames = Directory.EnumerateFiles("D:");
        var fileResults = from fileName in fileNames
                         select
                         (
                              Name: fileName,
                              LastWriteTime: File.GetLastWriteTime(fileName)
                         );
        foreach(var fileResult in fileResults)
        {
            Console.WriteLine($@"{fileResult.Name}({fileResult.LastWriteTime})");
        }

假如数据量非常大,而且检索数据的代价非常高,那么投射可以减少与集合中每一项关联的数据量,效率的提升将非常明显。使用元组执行查询时可以不获取全部数据,而是只在集合中存储和获取需要的数据。 

2、where 筛选

用where子句在垂直方向上筛选集合,筛选条件用谓词表示。所谓谓词,本质上就是返回bool值的Lambda表达式。

        IEnumerable files=from fileName in Directory.EnumerateFiles("D:")
                                    where File.GetLastWriteTime(fileName) > DateTime.Now.AddMonths(-3)
                                    select new FileInfo(fileName);
        foreach (var item in files)
        {
            var path = item.FullName;
            Console.WriteLine($"{path} ({item.LastWriteTime})");
        }

 D:\SFGH.docx (2022/8/8 14:41:51)

3、orderby 排序 

//首先以文件长度降序,再按文件名排序,多个排序以逗号分割,排序方式默认ascending
IEnumerable fileNames = from fileName in Directory.EnumerateFiles("D:")
                                orderby (new FileInfo(fileName)).Length descending,fileName
                                select fileName;

4、let子句 引入单位变量

let子句容纳的表达式值可在查询表达式剩余部分使用。可添加任意数量的let子句,只需把它们放在第一个from子句之后、最后一个select/groupby子句之前。

//多次实例化FileInfo对象,造成无用开销
IEnumerable files1 = from fileName in Directory.EnumerateFiles("D:")
                               orderby (new FileInfo(fileName)).Length descending,fileName
                               select new FileInfo(fileName);
//使用let子句削减开销
IEnumerable files2 = from fileName in Directory.EnumerateFiles("D:")
                               let file=new FileInfo(fileName)
                               orderby file.Length descending, fileName
                               select file;

5、 group by 分组

LINQ允许将单独的项分组到一系列子集合中,还允许那些组与所查询的集合中的项关联。

IEnumerable Keys =new List {"a.b","ae.c","egf"};
IEnumerable> selection = from word in Keys 
                                                 group word by word.Contains('.');
foreach (var group in selection)
{
    Console.WriteLine(group.Key);
    foreach (var item in group)
    {
        Console.WriteLine(item);
    }
}

True
a.b
ae.c
False
egf

6、into 扩展查询

将一个查询作为另一个查询的输入。可以应用于所有的查询表达式。可以链接任意数量的查询。

7、from 平整序列的序列

将序列的序列平整成单个序列

 var selection = from word in Keys
                 from character in word
                 select character;

 

你可能感兴趣的:(C#,linq,1024程序员节)