c# Linq查詢?cè)斀?/h1>
更新時(shí)間:2021年04月13日 09:04:33 作者:DullFish
這篇文章主要介紹了c# Linq查詢的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)使用c#,感興趣的朋友可以了解下
c#提供的ling查詢極大的遍歷了集合的查詢過(guò)程,且使用簡(jiǎn)單方便,非常的有用。
下面將分別用簡(jiǎn)單的例子說(shuō)明:ling基本查詢、延遲查詢屬性、類型篩選、復(fù)合from字句、多級(jí)排序、分組查詢、聯(lián)合查詢、合并、分頁(yè)、聚合操作符、并行l(wèi)inq、取消長(zhǎng)時(shí)間運(yùn)行的并行l(wèi)ing查詢。
Lambda表達(dá)式簡(jiǎn)介:
/*Lambda表達(dá)式:Lambda 表達(dá)式是一種可用于創(chuàng)建委托或表達(dá)式目錄樹(shù)類型的匿名函數(shù)
表達(dá)式位于 => 運(yùn)算符右側(cè)的 lambda 表達(dá)式稱為“表達(dá)式 lambda”。
* (input parameters) => expression
* 示例:*/
delegate int del(int i);
static void Main(string[] args)
{
del myDelegate = x => x * x;
int j = myDelegate(5); //最后j = 25
}
基本查詢
語(yǔ)句:
var query = from r in listStudents where r.score < 60 orderby r.score descending select r;
//var q2 = listStudents.Where(r => r.score < 60).OrderByDescending(r => r.score).Select(r => r) ;//或使用Lambda表達(dá)式
例子:
/// <summary>
/// 學(xué)生結(jié)構(gòu)體
/// </summary>
struct Student
{
/// <summary>
/// 姓名
/// </summary>
public string name;
/// <summary>
/// 年齡
/// </summary>
public int age;
/// <summary>
/// 班號(hào)
/// </summary>
public int grade;
/// <summary>
/// 分?jǐn)?shù)
/// </summary>
public float score;
}
/// <summary>
/// linq
/// 基本查詢
/// </summary>
static void Linq1()
{
#region 構(gòu)造查詢數(shù)據(jù)
List<Student> listStudents = new List<Student>();
Random pRandom = new Random();
for (int i = 1; i < 50; i++)
{
float sc = pRandom.Next(0, 100);
int age = pRandom.Next(8, 13);
int gde = pRandom.Next(1, 6);
string name = "";
switch (pRandom.Next(0, 6))
{
case 1: name = "周xxx"; break;
case 2: name = "李xxx"; break;
case 3: name = "孫xxx"; break;
case 4: name = "錢xxx"; break;
default: name = "趙xxx"; break;
}
Student psdt = new Student();
psdt.name = name;
psdt.age = age;
psdt.grade = gde;
psdt.score = sc;
listStudents.Add(psdt);
}
#endregion
//從50個(gè)學(xué)生中選擇出不及格的人員名單并按分?jǐn)?shù)降序排列
var query = from r in listStudents where r.score < 60 orderby r.score descending select r;
//var q2 = listStudents.Where(r => r.score < 60).OrderByDescending(r => r.score).Select(r => r) ;//或使用Lambda表達(dá)式
//orderby升序即從小到大,orderby r.score descending降序即從大到小
Console.WriteLine("不及格的人員名單:");
foreach (Student st in query)
{
Console.WriteLine("***************");
Console.WriteLine("姓名:"+st.name);
Console.WriteLine("班級(jí):"+st.grade);
Console.WriteLine("年齡:"+st.age);
Console.WriteLine("分?jǐn)?shù):"+st.score);
}
Console.ReadKey();
}
延遲查詢屬性
linq查詢?yōu)檠舆t查詢,只需構(gòu)造一次查詢語(yǔ)句,可以多次使用。
例子:
/// <summary>
/// Linq
/// 延遲查詢
/// linq查詢?yōu)檠舆t查詢,只需構(gòu)造一次查詢語(yǔ)句,可以多次使用
/// </summary>
static void Linq2()
{
#region 構(gòu)造查詢數(shù)據(jù)
List<string> lists = new List<string> { "Jack","Pet","Hant","Li","Kkk"};
#endregion
var query = from r in lists where r.StartsWith("J") select r;
Console.WriteLine("第一次查詢結(jié)果:");
foreach (string st in query)
{
Console.WriteLine( st);
}
Console.WriteLine("第二次查詢結(jié)果:");
lists.Add("Jone");
lists.Add("Jimi");
lists.Add("Johu");
foreach (string st in query)
{
Console.WriteLine(st);
}
Console.ReadKey();
/*
輸出結(jié)果:
* 第一次:Jack
* 第二次:Jack Jone Jimi Johu
*/
}
類型篩選
利用OfType方法可以把特定類型數(shù)據(jù)篩選出來(lái)。
例子
/// <summary>
/// Linq類型篩選-ofType
/// </summary>
static void Linq3()
{
object[] pList = new object[] { 1,"one",2,"two",3,"three"};
var query = pList.OfType<string>();
foreach (var st in query)
{
Console.WriteLine(st);
}
Console.ReadKey();
/*
輸出結(jié)果:
* one two three
*/
}
復(fù)合from子句
語(yǔ)句:
var query = from s in listStudents
from n in s.name
where n == '趙' orderby s.score descending
select s.grade + "班-" + s.name + ",分?jǐn)?shù)" + +s.score;
/*查詢出所有姓趙的學(xué)生的班級(jí)、姓名、分?jǐn)?shù)信息,并按分?jǐn)?shù)由高到低排序*/
例子:
/// <summary>
/// linq復(fù)合from字句
/// </summary>
static void Linq4()
{
#region 構(gòu)造查詢數(shù)據(jù)
List<Student> listStudents = new List<Student>();
Random pRandom = new Random();
for (int i = 1; i < 50; i++)
{
float sc = pRandom.Next(0, 100);
int age = pRandom.Next(8, 13);
int gde = pRandom.Next(1, 6);
string name = "";
switch (pRandom.Next(0, 6))
{
case 1: name = "周xxx"; break;
case 2: name = "李xxx"; break;
case 3: name = "孫xxx"; break;
case 4: name = "錢xxx"; break;
default: name = "趙xxx"; break;
}
Student psdt = new Student();
psdt.name = name;
psdt.age = age;
psdt.grade = gde;
psdt.score = sc;
listStudents.Add(psdt);
}
#endregion
var query = from s in listStudents
from n in s.name
where n == '趙' orderby s.score descending
select s.grade + "班-" + s.name + ",分?jǐn)?shù)" + +s.score;
/*查詢出所有姓趙的學(xué)生的班級(jí)、姓名、分?jǐn)?shù)信息,并按分?jǐn)?shù)由高到低排序*/
foreach (var t in query)
{
Console.WriteLine(t);
}
Console.ReadKey();
}
多級(jí)排序
語(yǔ)句:
//參數(shù)越靠前,優(yōu)先級(jí)越高
//先按score排序,當(dāng)分?jǐn)?shù)相同時(shí)再按grade排序...依次類推
var query = from s in listStudents orderby s.score, s.grade, s.age, s.name select s;
例子:
/// <summary>
/// 多級(jí)排序
/// </summary>
static void Linq5()
{
#region 構(gòu)造查詢數(shù)據(jù)
List<Student> listStudents = new List<Student>();
Random pRandom = new Random();
for (int i = 1; i < 50; i++)
{
float sc = pRandom.Next(0, 100);
int age = pRandom.Next(8, 13);
int gde = pRandom.Next(1, 6);
string name = "";
switch (pRandom.Next(0, 6))
{
case 1: name = "周xxx"; break;
case 2: name = "李xxx"; break;
case 3: name = "孫xxx"; break;
case 4: name = "錢xxx"; break;
default: name = "趙xxx"; break;
}
Student psdt = new Student();
psdt.name = name;
psdt.age = age;
psdt.grade = gde;
psdt.score = sc;
listStudents.Add(psdt);
}
#endregion
//參數(shù)越靠前,優(yōu)先級(jí)越高
//先按score排序,當(dāng)分?jǐn)?shù)相同時(shí)再按grade排序...依次類推
var query = from s in listStudents orderby s.score, s.grade, s.age, s.name select s;
foreach (Student st in query)
{
Console.WriteLine("***************");
Console.WriteLine("姓名:" + st.name);
Console.WriteLine("班級(jí):" + st.grade);
Console.WriteLine("年齡:" + st.age);
Console.WriteLine("分?jǐn)?shù):" + st.score);
}
Console.ReadKey();
}
分組
語(yǔ)句:
//按國(guó)家分組,并選出大于2的組,形成新的集合
var query = from r in listChampion
group r by r.country into g
orderby g.Count() descending, g.Key
where g.Count() >= 2
select
new { country = g.Key, count = g.Count() };
例子:
/// <summary>
/// 分組
/// </summary>
static void Linq6()
{
List<Champions> listChampion = new List<Champions>();
listChampion.Add(new Champions() { name = "張**", country = "中國(guó)" });
listChampion.Add(new Champions() { name = "趙**", country = "中國(guó)" });
listChampion.Add(new Champions() { name = "李**", country = "中國(guó)" });
listChampion.Add(new Champions() { name = "李**", country = "中國(guó)" });
listChampion.Add(new Champions() { name = "Peter", country = "美國(guó)" });
listChampion.Add(new Champions() { name = "Hune", country = "美國(guó)" });
listChampion.Add(new Champions() { name = "Hune", country = "美國(guó)" });
listChampion.Add(new Champions() { name = "Jack", country = "俄羅斯" });
listChampion.Add(new Champions() { name = "Jack", country = "俄羅斯" });
listChampion.Add(new Champions() { name = "Jimi", country = "英國(guó)" });
//按國(guó)家分組,并選出大于2的組,形成新的集合
var query = from r in listChampion
group r by r.country into g
orderby g.Count() descending, g.Key
where g.Count() >= 2
select
new { country = g.Key, count = g.Count() };
foreach (var o in query)
{
Console.WriteLine("國(guó)家:{0},冠軍數(shù):{1}個(gè)", o.country, o.count);
}
Console.ReadKey();
}
聯(lián)合查詢-join
語(yǔ)句:
//查詢出集合qSt中year等于集合qSc中year的元素并形成新的集合
var qjoin = from r in qSt
join c in qSc
on r.year equals c.year
select new
{
Year = r.year,
stName = r.name,
scName = c.name
};
例子:
/// <summary>
/// 聯(lián)合查詢-join
/// </summary>
static void Linq7()
{
List<s> pSt = new List<s>();
pSt.Add(new s() {year=1999,name="xxx" });
pSt.Add(new s() { year = 2000, name = "xxx" });
pSt.Add(new s() { year = 2001, name = "xxx" });
pSt.Add(new s() { year = 2010, name = "xxx" });
List<school> pSc = new List<school>();
pSc.Add(new school() { year = 1999, name = "***" });
pSc.Add(new school() { year = 2001, name = "***" });
pSc.Add(new school() { year = 2002, name = "***" });
pSc.Add(new school() { year = 2010, name = "***" });
pSc.Add(new school() { year = 2012, name = "***" });
var qSt = from r in pSt where r.year >= 2000 select r;
var qSc = from r in pSc where r.year >= 2000 select r;
//查詢出集合qSt中year等于集合qSc中year的元素并形成新的集合
var qjoin = from r in qSt
join c in qSc
on r.year equals c.year
select new
{
Year = r.year,
stName = r.name,
scName = c.name
};
foreach (var ite in qjoin)
{
Console.WriteLine(ite.Year + " " + ite.scName + " " + ite.stName);
Console.WriteLine("");
}
Console.ReadKey();
}
合并-zip()
.Net4.0新增,可對(duì)兩個(gè)相關(guān)的序列進(jìn)行合并。
語(yǔ)句:
/*若合并兩項(xiàng)項(xiàng)數(shù)不同,則在達(dá)到較小集合的末尾時(shí)停止*/
var qZip = qSc.Zip(qSt, (first, second) =>string.Format("Year:{0},Name:{1}.", first.Year,second.Name));//返回值qZip為字符串集合
例子:
/// <summary>
/// 合并-zip()-.Net4.0新增,可對(duì)兩個(gè)相關(guān)的序列進(jìn)行合并
/// </summary>
static void Linq8()
{
List<s> pSt = new List<s>();
pSt.Add(new s() { year = 1999, name = "一xxx" });
pSt.Add(new s() { year = 2000, name = "二xxx" });
pSt.Add(new s() { year = 2001, name = "三xxx" });
pSt.Add(new s() { year = 2010, name = "四xxx" });
pSt.Add(new s() { year = 2010, name = "五xxx" });
List<school> pSc = new List<school>();
pSc.Add(new school() { year = 1999, name = "1***" });
pSc.Add(new school() { year = 2012, name = "2***" });
pSc.Add(new school() { year = 2012, name = "3***" });
pSc.Add(new school() { year = 2012, name = "4***" });
pSc.Add(new school() { year = 2012, name = "5***" });
var qSt = from r in pSt where r.year >= 2000 orderby r.year select new { Year = r.year, Name = r.name };
var qSc = from r in pSc where r.year >= 2000 orderby r.year select new { Year = r.year, Name = r.name };
/*若合并兩項(xiàng)項(xiàng)數(shù)不同,則在達(dá)到較小集合的末尾時(shí)停止*/
var qZip = qSc.Zip(qSt, (first, second) =>string.Format("Year:{0},Name:{1}.", first.Year,second.Name));//返回值qZip為字符串集合
foreach (var ite in qZip)
{
Console.WriteLine(ite);
}
Console.ReadKey();
}
分區(qū)(分頁(yè))
通過(guò)Take()和Skip()實(shí)現(xiàn)只顯示部分查詢結(jié)果。
語(yǔ)句:
//通過(guò)skip跳過(guò)指定數(shù)量的元素,再通過(guò)take提取固定長(zhǎng)度元素,可實(shí)現(xiàn)分頁(yè)
var qr = (from r in listStudents orderby r.score descending select r).Skip(i * pageSize).Take(5);
//var qr2 = listStudents.OrderByDescending(r => r.score).Select(r => r).Skip(i * pageSize).Take(5);//或
例子
/// <summary>
/// 分區(qū)(分頁(yè))-通過(guò)Take()和Skip()實(shí)現(xiàn)只顯示部分查詢結(jié)果
/// </summary>
static void Linq9()
{
#region 構(gòu)造查詢數(shù)據(jù)
List<Student> listStudents = new List<Student>();
Random pRandom = new Random();
for (int i = 1; i < 50; i++)
{
float sc = pRandom.Next(0, 100);
int age = pRandom.Next(8, 13);
int gde = pRandom.Next(1, 6);
string name = "";
switch (pRandom.Next(0, 6))
{
case 1: name = "周xxx"; break;
case 2: name = "李xxx"; break;
case 3: name = "孫xxx"; break;
case 4: name = "錢xxx"; break;
default: name = "趙xxx"; break;
}
Student psdt = new Student();
psdt.name = name;
psdt.age = age;
psdt.grade = gde;
psdt.score = sc;
listStudents.Add(psdt);
}
#endregion
int pageSize = 5;
int numofPage = (int)Math.Ceiling(listStudents.Count /(double)pageSize);
for (int i = 0; i < numofPage; i++)
{
Console.WriteLine("第{0}頁(yè)", i);
//通過(guò)skip跳過(guò)指定數(shù)量的元素,再通過(guò)take提取固定長(zhǎng)度元素,可實(shí)現(xiàn)分頁(yè)
var qr = (from r in listStudents orderby r.score descending select r).Skip(i * pageSize).Take(5);
//var qr2 = listStudents.OrderByDescending(r => r.score).Select(r => r).Skip(i * pageSize).Take(5);//或
foreach (var ite in qr)
{
Console.WriteLine(ite.name);
Console.WriteLine(ite.score);
}
Console.WriteLine("");
}
Console.ReadKey();
}
并行l(wèi)inq
并行查詢可以分解查詢的工作,使其分布在多個(gè)線程上。當(dāng)pc擁有多個(gè)cpu時(shí),可以看到并行查詢帶來(lái)的改進(jìn)效果。并行LINQ適用于大型的集合查詢,并擁有一定的優(yōu)勢(shì)。使用
System.Collections.Concurrent.Partitioner.Create
可以手動(dòng)創(chuàng)建分區(qū)器。
語(yǔ)法:
var sum2 = (from x2 in data.AsParallel() where x2 > 20 select x2).Sum();//并行查詢
//var sum3 = data.AsParallel().Where(x3 => x3 > 20).Sum();//或并行查詢(Lambda表達(dá)式)
例子:
/// <summary>
/// 并行l(wèi)inq
/// </summary>
static void Linq11()
{
Console.WriteLine("開(kāi)始構(gòu)造大數(shù)組...");
//構(gòu)造大數(shù)組
const int count = 100000000;
var data = new int[count];
var r = new Random();
for (int i = 0; i < count; i++)
{
data[i] = r.Next(40);
}
Console.WriteLine("開(kāi)始計(jì)算...");
var st = System.DateTime.Now;
var sum = (from x in data where x > 20 select x).Sum();//常規(guī)linq-耗時(shí)1.8641s
var st2 = System.DateTime.Now;
var sum2 = (from x2 in data.AsParallel() where x2 > 20 select x2).Sum();//并行查詢-耗時(shí)0.6620s
//var sum3 = data.AsParallel().Where(x3 => x3 > 20).Sum();//或并行查詢----x3 => x3 > 20(Lambda表達(dá)式)
var st3 = System.DateTime.Now;
/*Partitioner.Create
手動(dòng)創(chuàng)建分區(qū)器
* Create具有多個(gè)重載,可依據(jù)需求進(jìn)行分區(qū)
*/
var sum4 = (from c in System.Collections.Concurrent.Partitioner.Create(data, true).AsParallel() where c > 20 select c).Sum();
var dt1 = st2 - st;
var dt2 = st3 - st2;
Console.WriteLine("常規(guī)linq耗時(shí):{0}s",dt1.TotalSeconds.ToString());
Console.WriteLine("并行l(wèi)inq耗時(shí):{0}s", dt2.TotalSeconds.ToString());
Console.ReadKey();
}
輸出結(jié)果:

可以粗魯?shù)恼J(rèn)為并行l(wèi)inq對(duì)于大集合的查詢是優(yōu)勢(shì)比較明顯的。
取消長(zhǎng)時(shí)間運(yùn)行的并行l(wèi)inq查詢
對(duì)于并行l(wèi)ing而言,可以設(shè)置可以利用System.Threading.CancellationTokenSource設(shè)置取消操作。
語(yǔ)法:
//通過(guò).WithCancellation(cts.Token)設(shè)置
var sum = (from x in data.AsParallel().WithCancellation(cts.Token) where x < 20 select x).Average();
例子:
/// <summary>
/// 取消長(zhǎng)時(shí)間運(yùn)行的并行l(wèi)inq查詢
/// </summary>
static void Linq12()
{
//構(gòu)造大數(shù)組
const int count = 100000000;
var data = new int[count];
var r = new Random();
for (int i = 0; i < count; i++)
{
data[i] = r.Next(40);
}
var cts = new System.Threading.CancellationTokenSource();
new System.Threading.Thread(() =>
{
try
{
//通過(guò).WithCancellation(cts.Token)設(shè)置
var sum = (from x in data.AsParallel().WithCancellation(cts.Token) where x < 20 select x).Average();
Console.WriteLine("sum:{0}", sum);
}
catch(OperationCanceledException ex)
{
Console.WriteLine(ex.Message);
}
}).Start();
Console.WriteLine("計(jì)算開(kāi)始...");
Console.WriteLine("取消請(qǐng)按n!");
var rk = Console.Read();
if(rk=='n'||rk=='N')
{
cts.Cancel();
}
}
至此,對(duì)于LINQ已經(jīng)有了一個(gè)基本的了解。
以上就是c# Linq查詢?cè)斀獾脑敿?xì)內(nèi)容,更多關(guān)于c# Linq查詢的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
您可能感興趣的文章:- C#集合查詢Linq在項(xiàng)目中使用詳解
- C# Linq延遲查詢的執(zhí)行實(shí)例代碼
- c# 動(dòng)態(tài)構(gòu)建LINQ查詢表達(dá)式
- C#使用LINQ查詢表達(dá)式的基本子句總結(jié)
- C# linq查詢之動(dòng)態(tài)OrderBy用法實(shí)例
- C#中Linq延遲查詢的例子
- C#使用linq語(yǔ)句查詢數(shù)組中以特定字符開(kāi)頭元素的方法
- C#使用linq查詢大數(shù)據(jù)集的方法
- C#中Linq查詢基本操作使用實(shí)例
- C# LINQ查詢表達(dá)式及對(duì)應(yīng)LAMBDA表達(dá)式的用法
- C#使用LINQ查詢操作符實(shí)例代碼(一)
相關(guān)文章
-
C#Js時(shí)間格式化問(wèn)題簡(jiǎn)單實(shí)例
這篇文章介紹了C#Js時(shí)間格式化問(wèn)題簡(jiǎn)單實(shí)例,有需要的朋友可以參考一下 2013-10-10
-
基于WPF實(shí)現(xiàn)一個(gè)簡(jiǎn)單的音頻播放動(dòng)畫控件
這篇文章主要介紹了如何利用WPF實(shí)現(xiàn)一個(gè)簡(jiǎn)單的音頻播放動(dòng)畫控件,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)或工作有一定幫助,需要的可以參考一下 2022-07-07
-
C#實(shí)現(xiàn)的ZPL條碼打印類完整實(shí)例
這篇文章主要介紹了C#實(shí)現(xiàn)的ZPL條碼打印類,結(jié)合實(shí)例形式詳細(xì)分析了C#實(shí)現(xiàn)條碼打印的原理與使用方法,代碼注釋中備有詳盡的說(shuō)明,便于理解使用,需要的朋友可以參考下 2016-06-06
最新評(píng)論
c#提供的ling查詢極大的遍歷了集合的查詢過(guò)程,且使用簡(jiǎn)單方便,非常的有用。
下面將分別用簡(jiǎn)單的例子說(shuō)明:ling基本查詢、延遲查詢屬性、類型篩選、復(fù)合from字句、多級(jí)排序、分組查詢、聯(lián)合查詢、合并、分頁(yè)、聚合操作符、并行l(wèi)inq、取消長(zhǎng)時(shí)間運(yùn)行的并行l(wèi)ing查詢。
Lambda表達(dá)式簡(jiǎn)介:
/*Lambda表達(dá)式:Lambda 表達(dá)式是一種可用于創(chuàng)建委托或表達(dá)式目錄樹(shù)類型的匿名函數(shù) 表達(dá)式位于 => 運(yùn)算符右側(cè)的 lambda 表達(dá)式稱為“表達(dá)式 lambda”。 * (input parameters) => expression * 示例:*/ delegate int del(int i); static void Main(string[] args) { del myDelegate = x => x * x; int j = myDelegate(5); //最后j = 25 }
基本查詢
語(yǔ)句:
var query = from r in listStudents where r.score < 60 orderby r.score descending select r; //var q2 = listStudents.Where(r => r.score < 60).OrderByDescending(r => r.score).Select(r => r) ;//或使用Lambda表達(dá)式
例子:
/// <summary> /// 學(xué)生結(jié)構(gòu)體 /// </summary> struct Student { /// <summary> /// 姓名 /// </summary> public string name; /// <summary> /// 年齡 /// </summary> public int age; /// <summary> /// 班號(hào) /// </summary> public int grade; /// <summary> /// 分?jǐn)?shù) /// </summary> public float score; } /// <summary> /// linq /// 基本查詢 /// </summary> static void Linq1() { #region 構(gòu)造查詢數(shù)據(jù) List<Student> listStudents = new List<Student>(); Random pRandom = new Random(); for (int i = 1; i < 50; i++) { float sc = pRandom.Next(0, 100); int age = pRandom.Next(8, 13); int gde = pRandom.Next(1, 6); string name = ""; switch (pRandom.Next(0, 6)) { case 1: name = "周xxx"; break; case 2: name = "李xxx"; break; case 3: name = "孫xxx"; break; case 4: name = "錢xxx"; break; default: name = "趙xxx"; break; } Student psdt = new Student(); psdt.name = name; psdt.age = age; psdt.grade = gde; psdt.score = sc; listStudents.Add(psdt); } #endregion //從50個(gè)學(xué)生中選擇出不及格的人員名單并按分?jǐn)?shù)降序排列 var query = from r in listStudents where r.score < 60 orderby r.score descending select r; //var q2 = listStudents.Where(r => r.score < 60).OrderByDescending(r => r.score).Select(r => r) ;//或使用Lambda表達(dá)式 //orderby升序即從小到大,orderby r.score descending降序即從大到小 Console.WriteLine("不及格的人員名單:"); foreach (Student st in query) { Console.WriteLine("***************"); Console.WriteLine("姓名:"+st.name); Console.WriteLine("班級(jí):"+st.grade); Console.WriteLine("年齡:"+st.age); Console.WriteLine("分?jǐn)?shù):"+st.score); } Console.ReadKey(); }
延遲查詢屬性
linq查詢?yōu)檠舆t查詢,只需構(gòu)造一次查詢語(yǔ)句,可以多次使用。
例子:
/// <summary> /// Linq /// 延遲查詢 /// linq查詢?yōu)檠舆t查詢,只需構(gòu)造一次查詢語(yǔ)句,可以多次使用 /// </summary> static void Linq2() { #region 構(gòu)造查詢數(shù)據(jù) List<string> lists = new List<string> { "Jack","Pet","Hant","Li","Kkk"}; #endregion var query = from r in lists where r.StartsWith("J") select r; Console.WriteLine("第一次查詢結(jié)果:"); foreach (string st in query) { Console.WriteLine( st); } Console.WriteLine("第二次查詢結(jié)果:"); lists.Add("Jone"); lists.Add("Jimi"); lists.Add("Johu"); foreach (string st in query) { Console.WriteLine(st); } Console.ReadKey(); /* 輸出結(jié)果: * 第一次:Jack * 第二次:Jack Jone Jimi Johu */ }
類型篩選
利用OfType方法可以把特定類型數(shù)據(jù)篩選出來(lái)。
例子
/// <summary> /// Linq類型篩選-ofType /// </summary> static void Linq3() { object[] pList = new object[] { 1,"one",2,"two",3,"three"}; var query = pList.OfType<string>(); foreach (var st in query) { Console.WriteLine(st); } Console.ReadKey(); /* 輸出結(jié)果: * one two three */ }
復(fù)合from子句
語(yǔ)句:
var query = from s in listStudents from n in s.name where n == '趙' orderby s.score descending select s.grade + "班-" + s.name + ",分?jǐn)?shù)" + +s.score; /*查詢出所有姓趙的學(xué)生的班級(jí)、姓名、分?jǐn)?shù)信息,并按分?jǐn)?shù)由高到低排序*/
例子:
/// <summary> /// linq復(fù)合from字句 /// </summary> static void Linq4() { #region 構(gòu)造查詢數(shù)據(jù) List<Student> listStudents = new List<Student>(); Random pRandom = new Random(); for (int i = 1; i < 50; i++) { float sc = pRandom.Next(0, 100); int age = pRandom.Next(8, 13); int gde = pRandom.Next(1, 6); string name = ""; switch (pRandom.Next(0, 6)) { case 1: name = "周xxx"; break; case 2: name = "李xxx"; break; case 3: name = "孫xxx"; break; case 4: name = "錢xxx"; break; default: name = "趙xxx"; break; } Student psdt = new Student(); psdt.name = name; psdt.age = age; psdt.grade = gde; psdt.score = sc; listStudents.Add(psdt); } #endregion var query = from s in listStudents from n in s.name where n == '趙' orderby s.score descending select s.grade + "班-" + s.name + ",分?jǐn)?shù)" + +s.score; /*查詢出所有姓趙的學(xué)生的班級(jí)、姓名、分?jǐn)?shù)信息,并按分?jǐn)?shù)由高到低排序*/ foreach (var t in query) { Console.WriteLine(t); } Console.ReadKey(); }
多級(jí)排序
語(yǔ)句:
//參數(shù)越靠前,優(yōu)先級(jí)越高 //先按score排序,當(dāng)分?jǐn)?shù)相同時(shí)再按grade排序...依次類推 var query = from s in listStudents orderby s.score, s.grade, s.age, s.name select s;
例子:
/// <summary> /// 多級(jí)排序 /// </summary> static void Linq5() { #region 構(gòu)造查詢數(shù)據(jù) List<Student> listStudents = new List<Student>(); Random pRandom = new Random(); for (int i = 1; i < 50; i++) { float sc = pRandom.Next(0, 100); int age = pRandom.Next(8, 13); int gde = pRandom.Next(1, 6); string name = ""; switch (pRandom.Next(0, 6)) { case 1: name = "周xxx"; break; case 2: name = "李xxx"; break; case 3: name = "孫xxx"; break; case 4: name = "錢xxx"; break; default: name = "趙xxx"; break; } Student psdt = new Student(); psdt.name = name; psdt.age = age; psdt.grade = gde; psdt.score = sc; listStudents.Add(psdt); } #endregion //參數(shù)越靠前,優(yōu)先級(jí)越高 //先按score排序,當(dāng)分?jǐn)?shù)相同時(shí)再按grade排序...依次類推 var query = from s in listStudents orderby s.score, s.grade, s.age, s.name select s; foreach (Student st in query) { Console.WriteLine("***************"); Console.WriteLine("姓名:" + st.name); Console.WriteLine("班級(jí):" + st.grade); Console.WriteLine("年齡:" + st.age); Console.WriteLine("分?jǐn)?shù):" + st.score); } Console.ReadKey(); }
分組
語(yǔ)句:
//按國(guó)家分組,并選出大于2的組,形成新的集合 var query = from r in listChampion group r by r.country into g orderby g.Count() descending, g.Key where g.Count() >= 2 select new { country = g.Key, count = g.Count() };
例子:
/// <summary> /// 分組 /// </summary> static void Linq6() { List<Champions> listChampion = new List<Champions>(); listChampion.Add(new Champions() { name = "張**", country = "中國(guó)" }); listChampion.Add(new Champions() { name = "趙**", country = "中國(guó)" }); listChampion.Add(new Champions() { name = "李**", country = "中國(guó)" }); listChampion.Add(new Champions() { name = "李**", country = "中國(guó)" }); listChampion.Add(new Champions() { name = "Peter", country = "美國(guó)" }); listChampion.Add(new Champions() { name = "Hune", country = "美國(guó)" }); listChampion.Add(new Champions() { name = "Hune", country = "美國(guó)" }); listChampion.Add(new Champions() { name = "Jack", country = "俄羅斯" }); listChampion.Add(new Champions() { name = "Jack", country = "俄羅斯" }); listChampion.Add(new Champions() { name = "Jimi", country = "英國(guó)" }); //按國(guó)家分組,并選出大于2的組,形成新的集合 var query = from r in listChampion group r by r.country into g orderby g.Count() descending, g.Key where g.Count() >= 2 select new { country = g.Key, count = g.Count() }; foreach (var o in query) { Console.WriteLine("國(guó)家:{0},冠軍數(shù):{1}個(gè)", o.country, o.count); } Console.ReadKey(); }
聯(lián)合查詢-join
語(yǔ)句:
//查詢出集合qSt中year等于集合qSc中year的元素并形成新的集合 var qjoin = from r in qSt join c in qSc on r.year equals c.year select new { Year = r.year, stName = r.name, scName = c.name };
例子:
/// <summary> /// 聯(lián)合查詢-join /// </summary> static void Linq7() { List<s> pSt = new List<s>(); pSt.Add(new s() {year=1999,name="xxx" }); pSt.Add(new s() { year = 2000, name = "xxx" }); pSt.Add(new s() { year = 2001, name = "xxx" }); pSt.Add(new s() { year = 2010, name = "xxx" }); List<school> pSc = new List<school>(); pSc.Add(new school() { year = 1999, name = "***" }); pSc.Add(new school() { year = 2001, name = "***" }); pSc.Add(new school() { year = 2002, name = "***" }); pSc.Add(new school() { year = 2010, name = "***" }); pSc.Add(new school() { year = 2012, name = "***" }); var qSt = from r in pSt where r.year >= 2000 select r; var qSc = from r in pSc where r.year >= 2000 select r; //查詢出集合qSt中year等于集合qSc中year的元素并形成新的集合 var qjoin = from r in qSt join c in qSc on r.year equals c.year select new { Year = r.year, stName = r.name, scName = c.name }; foreach (var ite in qjoin) { Console.WriteLine(ite.Year + " " + ite.scName + " " + ite.stName); Console.WriteLine(""); } Console.ReadKey(); }
合并-zip()
.Net4.0新增,可對(duì)兩個(gè)相關(guān)的序列進(jìn)行合并。
語(yǔ)句:
/*若合并兩項(xiàng)項(xiàng)數(shù)不同,則在達(dá)到較小集合的末尾時(shí)停止*/ var qZip = qSc.Zip(qSt, (first, second) =>string.Format("Year:{0},Name:{1}.", first.Year,second.Name));//返回值qZip為字符串集合
例子:
/// <summary> /// 合并-zip()-.Net4.0新增,可對(duì)兩個(gè)相關(guān)的序列進(jìn)行合并 /// </summary> static void Linq8() { List<s> pSt = new List<s>(); pSt.Add(new s() { year = 1999, name = "一xxx" }); pSt.Add(new s() { year = 2000, name = "二xxx" }); pSt.Add(new s() { year = 2001, name = "三xxx" }); pSt.Add(new s() { year = 2010, name = "四xxx" }); pSt.Add(new s() { year = 2010, name = "五xxx" }); List<school> pSc = new List<school>(); pSc.Add(new school() { year = 1999, name = "1***" }); pSc.Add(new school() { year = 2012, name = "2***" }); pSc.Add(new school() { year = 2012, name = "3***" }); pSc.Add(new school() { year = 2012, name = "4***" }); pSc.Add(new school() { year = 2012, name = "5***" }); var qSt = from r in pSt where r.year >= 2000 orderby r.year select new { Year = r.year, Name = r.name }; var qSc = from r in pSc where r.year >= 2000 orderby r.year select new { Year = r.year, Name = r.name }; /*若合并兩項(xiàng)項(xiàng)數(shù)不同,則在達(dá)到較小集合的末尾時(shí)停止*/ var qZip = qSc.Zip(qSt, (first, second) =>string.Format("Year:{0},Name:{1}.", first.Year,second.Name));//返回值qZip為字符串集合 foreach (var ite in qZip) { Console.WriteLine(ite); } Console.ReadKey(); }
分區(qū)(分頁(yè))
通過(guò)Take()和Skip()實(shí)現(xiàn)只顯示部分查詢結(jié)果。
語(yǔ)句:
//通過(guò)skip跳過(guò)指定數(shù)量的元素,再通過(guò)take提取固定長(zhǎng)度元素,可實(shí)現(xiàn)分頁(yè) var qr = (from r in listStudents orderby r.score descending select r).Skip(i * pageSize).Take(5); //var qr2 = listStudents.OrderByDescending(r => r.score).Select(r => r).Skip(i * pageSize).Take(5);//或
例子
/// <summary> /// 分區(qū)(分頁(yè))-通過(guò)Take()和Skip()實(shí)現(xiàn)只顯示部分查詢結(jié)果 /// </summary> static void Linq9() { #region 構(gòu)造查詢數(shù)據(jù) List<Student> listStudents = new List<Student>(); Random pRandom = new Random(); for (int i = 1; i < 50; i++) { float sc = pRandom.Next(0, 100); int age = pRandom.Next(8, 13); int gde = pRandom.Next(1, 6); string name = ""; switch (pRandom.Next(0, 6)) { case 1: name = "周xxx"; break; case 2: name = "李xxx"; break; case 3: name = "孫xxx"; break; case 4: name = "錢xxx"; break; default: name = "趙xxx"; break; } Student psdt = new Student(); psdt.name = name; psdt.age = age; psdt.grade = gde; psdt.score = sc; listStudents.Add(psdt); } #endregion int pageSize = 5; int numofPage = (int)Math.Ceiling(listStudents.Count /(double)pageSize); for (int i = 0; i < numofPage; i++) { Console.WriteLine("第{0}頁(yè)", i); //通過(guò)skip跳過(guò)指定數(shù)量的元素,再通過(guò)take提取固定長(zhǎng)度元素,可實(shí)現(xiàn)分頁(yè) var qr = (from r in listStudents orderby r.score descending select r).Skip(i * pageSize).Take(5); //var qr2 = listStudents.OrderByDescending(r => r.score).Select(r => r).Skip(i * pageSize).Take(5);//或 foreach (var ite in qr) { Console.WriteLine(ite.name); Console.WriteLine(ite.score); } Console.WriteLine(""); } Console.ReadKey(); }
并行l(wèi)inq
并行查詢可以分解查詢的工作,使其分布在多個(gè)線程上。當(dāng)pc擁有多個(gè)cpu時(shí),可以看到并行查詢帶來(lái)的改進(jìn)效果。并行LINQ適用于大型的集合查詢,并擁有一定的優(yōu)勢(shì)。使用
System.Collections.Concurrent.Partitioner.Create
可以手動(dòng)創(chuàng)建分區(qū)器。
語(yǔ)法:
var sum2 = (from x2 in data.AsParallel() where x2 > 20 select x2).Sum();//并行查詢 //var sum3 = data.AsParallel().Where(x3 => x3 > 20).Sum();//或并行查詢(Lambda表達(dá)式)
例子:
/// <summary> /// 并行l(wèi)inq /// </summary> static void Linq11() { Console.WriteLine("開(kāi)始構(gòu)造大數(shù)組..."); //構(gòu)造大數(shù)組 const int count = 100000000; var data = new int[count]; var r = new Random(); for (int i = 0; i < count; i++) { data[i] = r.Next(40); } Console.WriteLine("開(kāi)始計(jì)算..."); var st = System.DateTime.Now; var sum = (from x in data where x > 20 select x).Sum();//常規(guī)linq-耗時(shí)1.8641s var st2 = System.DateTime.Now; var sum2 = (from x2 in data.AsParallel() where x2 > 20 select x2).Sum();//并行查詢-耗時(shí)0.6620s //var sum3 = data.AsParallel().Where(x3 => x3 > 20).Sum();//或并行查詢----x3 => x3 > 20(Lambda表達(dá)式) var st3 = System.DateTime.Now; /*Partitioner.Create 手動(dòng)創(chuàng)建分區(qū)器 * Create具有多個(gè)重載,可依據(jù)需求進(jìn)行分區(qū) */ var sum4 = (from c in System.Collections.Concurrent.Partitioner.Create(data, true).AsParallel() where c > 20 select c).Sum(); var dt1 = st2 - st; var dt2 = st3 - st2; Console.WriteLine("常規(guī)linq耗時(shí):{0}s",dt1.TotalSeconds.ToString()); Console.WriteLine("并行l(wèi)inq耗時(shí):{0}s", dt2.TotalSeconds.ToString()); Console.ReadKey(); }
輸出結(jié)果:
可以粗魯?shù)恼J(rèn)為并行l(wèi)inq對(duì)于大集合的查詢是優(yōu)勢(shì)比較明顯的。
取消長(zhǎng)時(shí)間運(yùn)行的并行l(wèi)inq查詢
對(duì)于并行l(wèi)ing而言,可以設(shè)置可以利用System.Threading.CancellationTokenSource設(shè)置取消操作。
語(yǔ)法:
//通過(guò).WithCancellation(cts.Token)設(shè)置 var sum = (from x in data.AsParallel().WithCancellation(cts.Token) where x < 20 select x).Average();
例子:
/// <summary> /// 取消長(zhǎng)時(shí)間運(yùn)行的并行l(wèi)inq查詢 /// </summary> static void Linq12() { //構(gòu)造大數(shù)組 const int count = 100000000; var data = new int[count]; var r = new Random(); for (int i = 0; i < count; i++) { data[i] = r.Next(40); } var cts = new System.Threading.CancellationTokenSource(); new System.Threading.Thread(() => { try { //通過(guò).WithCancellation(cts.Token)設(shè)置 var sum = (from x in data.AsParallel().WithCancellation(cts.Token) where x < 20 select x).Average(); Console.WriteLine("sum:{0}", sum); } catch(OperationCanceledException ex) { Console.WriteLine(ex.Message); } }).Start(); Console.WriteLine("計(jì)算開(kāi)始..."); Console.WriteLine("取消請(qǐng)按n!"); var rk = Console.Read(); if(rk=='n'||rk=='N') { cts.Cancel(); } }
至此,對(duì)于LINQ已經(jīng)有了一個(gè)基本的了解。
以上就是c# Linq查詢?cè)斀獾脑敿?xì)內(nèi)容,更多關(guān)于c# Linq查詢的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- C#集合查詢Linq在項(xiàng)目中使用詳解
- C# Linq延遲查詢的執(zhí)行實(shí)例代碼
- c# 動(dòng)態(tài)構(gòu)建LINQ查詢表達(dá)式
- C#使用LINQ查詢表達(dá)式的基本子句總結(jié)
- C# linq查詢之動(dòng)態(tài)OrderBy用法實(shí)例
- C#中Linq延遲查詢的例子
- C#使用linq語(yǔ)句查詢數(shù)組中以特定字符開(kāi)頭元素的方法
- C#使用linq查詢大數(shù)據(jù)集的方法
- C#中Linq查詢基本操作使用實(shí)例
- C# LINQ查詢表達(dá)式及對(duì)應(yīng)LAMBDA表達(dá)式的用法
- C#使用LINQ查詢操作符實(shí)例代碼(一)
相關(guān)文章
C#Js時(shí)間格式化問(wèn)題簡(jiǎn)單實(shí)例
這篇文章介紹了C#Js時(shí)間格式化問(wèn)題簡(jiǎn)單實(shí)例,有需要的朋友可以參考一下2013-10-10基于WPF實(shí)現(xiàn)一個(gè)簡(jiǎn)單的音頻播放動(dòng)畫控件
這篇文章主要介紹了如何利用WPF實(shí)現(xiàn)一個(gè)簡(jiǎn)單的音頻播放動(dòng)畫控件,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)或工作有一定幫助,需要的可以參考一下2022-07-07C#實(shí)現(xiàn)的ZPL條碼打印類完整實(shí)例
這篇文章主要介紹了C#實(shí)現(xiàn)的ZPL條碼打印類,結(jié)合實(shí)例形式詳細(xì)分析了C#實(shí)現(xiàn)條碼打印的原理與使用方法,代碼注釋中備有詳盡的說(shuō)明,便于理解使用,需要的朋友可以參考下2016-06-06