Linq我暫時理解為,一種內(nèi)置的非常方便的數(shù)據(jù)查詢的工具
使用
我們先學(xué)習(xí)它的使用
//數(shù)據(jù)類
public class DataTest
{
/// <summary>
/// 編號
/// </summary>
public int id;
/// <summary>
/// 名字
/// </summary>
public string name;
/// <summary>
/// 介紹
/// </summary>
public string describe;
/// <summary>
/// 年齡
/// </summary>
public int age;
}
//新建了一個List數(shù)據(jù),用來測試數(shù)據(jù)查詢?
List<DataTest> dataTests = new List<DataTest>()
{
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
},
};
//現(xiàn)在定義一個需求,需要查出id>2的數(shù)據(jù)
我們一般的寫法,應(yīng)該是foreach
Console.WriteLine("**************foreach遍歷*****************");
foreach (var item in dataTests)
{
if (item.id > 2) {
Console.WriteLine($"id:{item.id} name:{item.name} age:{item.age}");
}
}
現(xiàn)在我們用Linq的方式來寫
引用Linq的命名空間
using System.Linq;
?引用命名空間之后,我們的list對象,擁有了一個擴展方法,Where
(擴展方法,在之前的博客有專門講過)
我們現(xiàn)在看看Where怎么用
我們看到Where函數(shù)是 需要一個Func的參數(shù) func的參數(shù)是我們的數(shù)據(jù),返回值是一個bool
?我們F12 查看,Func類的介紹,防止你們這一步看不懂了
?
Linq擴展方法寫法
我們用Lambda表達式來寫的話,就是這個樣子的
(Lambda表達式,在之前的博客也有專門講過)
var list = dataTests.Where(d => d.id > 2);
"匿名函數(shù)的寫法,熟練的同學(xué)用上面這種方式寫,更簡潔"
//var list = dataTests.Where((DataTest d)=> { return d.id > 2; });
//var list = dataTests.Where(delegate (DataTest d){ return d.id > 2; });
"上面這一步,就已經(jīng)取出我們需要的值, 下面這個循環(huán)只做輸出用"
foreach (var item in list)
{
Console.WriteLine($"id:{item.id} name:{item.name} age:{item.age}");
}
現(xiàn)在我們改變一下需求,用Linq的別的寫法age < 30同時ID不等于0
Linq關(guān)鍵字寫法
這個寫法應(yīng)該學(xué)過數(shù)據(jù)庫的同學(xué),應(yīng)該更容易理解
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}");
}
結(jié)果是只有一條數(shù)據(jù)符合要求,證明我們的寫法都是正確的
?自己編寫Linq
為了方便理解,我們自己也寫一個同樣功能的Linq
這里看不懂的還是要回去看看擴展方法那一節(jié)
public static class Extension
{
public static List<DataTest> MyWhere(this List<DataTest> resource ,Func<DataTest,bool> func)
{
var list = new List<DataTest>();
foreach (var item in resource)
{
if (func(item)) {
list.Add(item);
}
}
return list;
}
}
//其實Linq就是把我們要寫的循環(huán)封裝了
我們現(xiàn)在使用自己寫的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}");
}
?
效果完全一樣.但是我們的這個復(fù)用性太低了,我們用泛型給它改一下?
public static List<T> MyWhereCommon<T>(this List<T> resource, Func<T, bool> func)
{
var list = new List<T>();
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}");
}
用法沒變,但是我們別的集合也可以通用了文章來源:http://www.zghlxwxcb.cn/news/detail-459819.html
當(dāng)然,舉一反三,大家可以可以通過這個寫法,寫出更多適合需求的工具文章來源地址http://www.zghlxwxcb.cn/news/detail-459819.html
到了這里,關(guān)于C# Linq 學(xué)會使用,學(xué)會自己編寫Linq的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!