【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<FileInfo> 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<string> 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<FileInfo> files1 = from fileName in Directory.EnumerateFiles("D:")
                               orderby (new FileInfo(fileName)).Length descending,fileName
                               select new FileInfo(fileName);
//使用let子句削减开销
IEnumerable<FileInfo> files2 = from fileName in Directory.EnumerateFiles("D:")
                               let file=new FileInfo(fileName)
                               orderby file.Length descending, fileName
                               select file;

5、 group by 分组

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

IEnumerable<string> Keys =new List<string> {"a.b","ae.c","egf"};
IEnumerable<IGrouping<bool, string>> 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;

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值