Linq我暂时理解为,一种内置的非常方便的数据查询的工具
使用我们先学习它的使用
//数据类
public class DataTest
{
///
/// 编号
///
public int id;
///
/// 名字
///
public string name;
///
/// 介绍
///
public string describe;
///
/// 年龄
///
public int age;
}
//新建了一个List数据,用来测试数据查询
ListdataTests = new List () { new DataTest(){ id = 0, name = "一", describe ="介绍", age = 10 }, new DataTest(){ id = 1, name = "二", describe ="介绍", age = 20 }, new DataTest(){ id = 2, name = "三", describe ="介绍", age = 30 }, new DataTest(){ id = 3, name = "四", describe ="介绍", age = 40 }, new DataTest(){ id = 4, name = "五", describe ="介绍", age = 50 }, new DataTest(){ id = 5, name = "六", describe ="介绍", age = 60 }, };
//现在定义一个需求,需要查出id>2的数据
我们一般的写法,应该是foreachConsole.WriteLine("**************foreach遍历*****************");
foreach (var item in dataTests)
{
if (item.id > 2) {
Console.WriteLine($"id:{item.id} name:{item.name} age:{item.age}");
}
}
现在我们用Linq的方式来写
引用Linq的命名空间
using System.Linq;
引用命名空间之后,我们的list对象,拥有了一个扩展方法,Where
(扩展方法,在之前的博客有专门讲过)
我们现在看看Where怎么用
我们看到Where函数是 需要一个Func的参数 func的参数是我们的数据,返回值是一个bool
我们F12 查看,Func类的介绍,防止你们这一步看不懂了
Linq扩展方法写法
我们用Lambda表达式来写的话,就是这个样子的
(Lambda表达式,在之前的博客也有专门讲过)
var list = dataTests.Where(d => d.id > 2);
"匿名函数的写法,熟练的同学用上面这种方式写,更简洁"
//var list = dataTests.Where((DataTest d)=> { return d.id > 2; });
//var list = dataTests.Where(delegate (DataTest d){ return d.id > 2; });
"上面这一步,就已经取出我们需要的值, 下面这个循环只做输出用"
foreach (var item in list)
{
Console.WriteLine($"id:{item.id} name:{item.name} age:{item.age}");
}
现在我们改变一下需求,用Linq的别的写法age < 30同时ID不等于0
Linq关键字写法这个写法应该学过数据库的同学,应该更容易理解
var list = from d in dataTests
where d.age < 30 && d.id != 0
select d;
foreach (var item in list)
{
Console.WriteLine($"id:{item.id} name:{item.name} age:{item.age}");
}
结果是只有一条数据符合要求,证明我们的写法都是正确的
自己编写Linq为了方便理解,我们自己也写一个同样功能的Linq
这里看不懂的还是要回去看看扩展方法那一节
public static class Extension
{
public static List MyWhere(this List resource ,Func func)
{
var list = new List();
foreach (var item in resource)
{
if (func(item)) {
list.Add(item);
}
}
return list;
}
}
//其实Linq就是把我们要写的循环封装了
我们现在使用自己写的Linq,看看效果怎么样
var list = dataTests.MyWhere((d)=> d.age < 30 && d.id != 0);
foreach (var item in list)
{
Console.WriteLine($"id:{item.id} name:{item.name} age:{item.age}");
}
效果完全一样.但是我们的这个复用性太低了,我们用泛型给它改一下
public static ListMyWhereCommon (this List resource, Func func) { var list = new List (); foreach (var item in resource) { if (func(item)) { list.Add(item); } } return list; }
var list = dataTests.MyWhereCommon((d)=> d.age < 30 && d.id != 0);
foreach (var item in list)
{
Console.WriteLine($"id:{item.id} name:{item.name} age:{item.age}");
}
用法没变,但是我们别的集合也可以通用了
当然,举一反三,大家可以可以通过这个写法,写出更多适合需求的工具



