什么是Linq
常见客户数据
- 列表
- 数据库
- CSV、XML、JSON
Linq
- 语言集成查询
- 对内存中数据,关系数据和xml数据执行查询检查
命令式 vs 声明式
- 命令式式过程导向的,而声明式则是结果导向的
- 对于sql,我们关心的是获取什么数据
- 而对于面向对象语言,我们更关心如何获取数据
- 命令式语言适合处理对象关系和逻辑过程
- 而声明式语言更适合处理数据关系
例:查找C:\Windows下最大的五个文件
- 命令式
using System;
using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using System.IO;
namespace Linq
{
class Program
{
static void Main(string[] args)
{
string path = @"C:\Windows";
ShowLargetsFiles(path);
Console.Read();
}
private static void ShowLargetsFiles(string path)
{
DirectoryInfo directory = new DirectoryInfo(path);
FileInfo[] files = directory.GetFiles();
Array.Sort(files, new FileInfoComparer());
for (int i = 0; i < 5; i++)
{
var f = files[i];
Console.WriteLine($"{f.Name,-20}:{f.Length,10:N}");
}
}
}
class FileInfoComparer : IComparer<FileInfo>
{
public int Compare( FileInfo x, FileInfo y)
{
return y.Length.CompareTo(x.Length);
}
}
}
- 使用Linq改写
using System;
using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using System.IO;
using System.Linq;
namespace Linq
{
class Program
{
static void Main(string[] args)
{
string path = @"C:\Windows";
ShowLargetsFilesWithLinq(path);
Console.Read();
}
private static void ShowLargetsFilesWithLinq(string path)
{
//var query = from file in new DirectoryInfo(path).GetFiles()
// orderby file.Length descending
// select file;
//foreach (var f in query.Take(5))
//{
// Console.WriteLine($"{f.Name,-20}:{f.Length,10:N}");
//}
// Linq是一种结合了声明式的命令式语法,所以我们依然可以使用对象的链式结构来完成整个推导数据的结果
var query = new DirectoryInfo(path).GetFiles()
.OrderByDescending(x => x.Length)
.Take(5);
foreach (var f in query)
{
Console.WriteLine($"{f.Name,-20}:{f.Length,10:N}");
}
}
}
}