LINQ基础
linq查詢操作包括三個部分:
獲取數據源 創建查詢 執行查詢
lambda表達式:
Lambda 表達式”是一個匿名函數,它可以包含表達式和語句,并且可用于創建委托或表達式目錄樹類型。
所有 Lambda 表達式都使用 Lambda 運算符 =>,該運算符讀為“goes to”。該 Lambda 運算符的左邊是輸入參數(如果有),右邊包含表達式或語句塊。Lambda 表達式 x => x * x 讀作“x goes to x times x”。可以將此表達式分配給委托類型
?static void Main()
?{
????????? del myDelegate = x => x * x;
????????? int j = myDelegate(5); //j = 25
????????? Console.WriteLine(j);
?}
???? delegate int del(int i);
只有在 Lambda 有一個輸入參數時,括號才是可選的;否則括號是必需的。無參也需要括號,兩個或更多輸入參數由括在括號中的逗號分隔:
???? (x, y) => x == y
Lambda 的一般規則如下:
Lambda 包含的參數數量必須與委托類型包含的參數數量相同。
Lambda 中的每個輸入參數必須都能夠隱式轉換為其對應的委托參數。
Lambda 的返回值(如果有)必須能夠隱式轉換為委托的返回類型。
查詢語法與方法語法:
string[] Devices= {"電視" ,"電冰箱","洗衣機","電話","微波爐"};
查詢語法
????? var SelectDevices = from device in Devices
??????????????????????????????? where device.StartsWith("電")
??????????????????????????????? select device;
方法語法
????? var SelectDevices =Devices .Where ( device => device.StartsWith("電"))
??
??????????? foreach (string dev in SelectDevices)
??????????? {
??????????????? Console.WriteLine("帶電的設備:{0}",dev);
?1.投影操作符?????????? }
(1)Select :對單個序列或集合中的值進行投影。
(2)SelectMany:將序列的每個元素投影到 IEnumerable<(Of <(T>)>) 并將結果序列合并為一個序列。
例子:
class Devices
??? {
??????? public string Name
??????? { get; set; }
??????? public List<double> Price
??????? { get; set; }
??? }
???? static void Main()
??????? {
??????????? Devices[] DeviceGroup = { new Devices { Name = "電視", Price =new List<double>{ 3000,2000} }, new Devices { Name = "電冰箱", Price =new List<double> { 4000,5000 }}, new Devices { Name = "洗衣機", Price =new List<double> { 1500,1000 }} };
??????????? var devices = DeviceGroup.SelectMany(device => device.Price? );
??????????? foreach (var? v in devices)
??????????? {
??????????????? Console.WriteLine(v);
??????????? }
??????? }
?2.限制操作符
(1)Where:對單個序列或集合中的值進行投影。
?3.排序操作符:按照升序和降序的方式對結果進行排序的功能。
(1)OrderBy:將序列中的返回值按照升序的順序進行排列。
(2)OrderByDescending:將序列中的返回值按照降序的順序進行排列。
(3)ThenBy:排序依據的次關鍵字。
(4)ThenByDescending:倒排序依據的次關鍵字。
(5)Reverse:反轉序列。
例子:
Devices[] DeviceGroup = { new Devices { Name = "電視", Price = 10000 }, new Devices { Name = "電話", Price = 240 }, new Devices { Name = "電視", Price = 3000 } };
??????????? var devices = from device in DeviceGroup
????????????????????????? orderby device.Name,device .Price descending
????????????????????????? select device;
?????????? // var devices = DeviceGroup.AsQueryable().OrderBy(device => device.Name).ThenByDescending(device => device.Price);
??????????? foreach (var dev in devices)
??????????? {
??????????????? Console.WriteLine("品名:{0},價格:{1}",dev.Name,dev.Price );
??????????? }
?4.聯接操作符:將兩個或多個數據源對象進行關聯或聯合。
(1)Join:按照一定的條件,將兩個數據源關聯起來。
(2)GroupJoin:將主數據源中的每一個值或元素與次數據源中相應的值聯接起來。
例子:
static void Main()
??????? {
?????????? List<StudentMessage> A_Class = new List<StudentMessage>(); //聲名一個A班,來存放學員
??????????? A_Class.Add(new StudentMessage { ID = 1001, Name = "張三", Sex = true, Age = 20 }); //添加學員
??????????? A_Class.Add(new StudentMessage { ID = 1002, Name = "李四", Sex = false, Age = 21 });//添加學員
??????????? List<Scort> A_ScortSheet = new List<Scort>(); //聲名一個成績表
??????????? A_ScortSheet.Add(new ChineaseScort { ID = 1001, Scort = 100f, Subject = "語文" }); //添加語文成績
??????????? A_ScortSheet.Add(new ChineaseScort { ID = 1002, Scort = 80f, Subject = "語文" });? //添加語文成績
??????????? A_ScortSheet.Add(new MathsScort { ID = 1001, Scort = 90f, Subject = "數學" });???? //添加數學成績
??????????? A_ScortSheet.Add(new MathsScort { ID = 1002, Scort = 60f, Subject = "數學" });???? //添加數學成績
??????????? var messages = A_Class.GroupJoin(A_ScortSheet, mes => mes.ID, sco => sco.ID, (mess, scor) => new { Mess = mess.ID, Mename = mess.Name, Scor = scor.Select(Scor => Scor) });
??????????? foreach (var scort in messages)
??????????? {
??????????????? Console.WriteLine("學號:{0,4} 姓名:{1}", scort.Mess, scort.Mename);
??????????????? foreach (var sc in scort.Scor)
??????????????? {
??????????????????? Console.WriteLine("? {0}:{1}分", sc.Subject, sc.Scort);
??????????????? }
??????????? }
數據源1.GroupJoin(數據源2,變量1=>數據源1.關聯字段,變量2=>數據源碼2.關聯字段,(數據源1數據變量,數據源2數據列表變量)=>new{變量a=數據源1.字段1,變量b=數據源1.字段2,變量c=數據源2列表變量.Select(變量c=變量c)})
?5.分組操作符:按照一定的值將序列中的值或元素進行分組。
(1)GroupBy
例子:
static void Main()
??????? {
??????????? Student[] students = new Student[] {
???????????? new Student{ClassName="A", Name="張三"},
???????????? new Student{ClassName ="B", Name ="李四"},
???????????? new Student{ClassName ="A" ,Name ="王五"},
???????????? new Student {ClassName ="B", Name ="趙六"},
???????????? new Student{ClassName ="B" ,Name ="錢七"},
???????????? new Student {ClassName ="B", Name ="孫八"}
??????????? };
??????????? var stus = (from stu in students
??????????????????????? select stu).GroupBy(st => st.ClassName);
??????????? //var stus = students.GroupBy(st => st.ClassName);
??????????? foreach (var v in stus)
??????????? {
??????????????? Console.WriteLine("{0}班學生:", v.Key);
??????????????? foreach (var va in v)
??????????????? {
??????????????????? Console.WriteLine("? 姓名:{0}", va.Name);
??????????????? }
??????????? }
??????? }
?6.合并操作符:將兩個對象合并在一起。
(1)Concat:
var Cont = Citys.Select(city => city).Concat(Mobiles.Select(mobil => mobil));
?7.聚合操作符:在一系列值上執行特定的運算,并返回單個值。
(1)Aggregate:從序列或集合中收集值。
(2)Average:求一個數值序列的平均值。
(3)Count:求一個數值序列的個數。(LongCount用法相同)。
(4)Sum:求一個數值序列的和。
例子:
string[] citys = {"北京","上海","東京"};
??????????? string newcity = citys.Aggregate((cityname,next)=>next+"-"+cityname);
??????????? Console.WriteLine(newcity);
//var quer = list.Count(lis=>lis.Chinese >80);
?8.集合操作符:對元素的集合或序列集合進行操作,并返回一個集合。
(1)Distinct:刪除集合中重復的值,并返回該項集合中互不相同的元素。
(2)Union:將兩個集合或序列合并后返回不同的元素。
(3)Intersect:返回兩個集合的交集。
(4)Except:返回序列一中序列二沒有的值。
?9.生成操作符:從現有的序列中創建新的序列。
(1)Empty:指定類型的空集。
?var s= Enumerable.Empty<string>();
?????????? Console.WriteLine(s.Count ());
(2)Range:創建一個包含數字序列的集合。
?foreach (var num in Enumerable.Range(3, 9))
??????????? {
??????????????? Console.WriteLine(num);
??????????? }
(3)Repeat:將值重復一定的次數。
?foreach (var num in Enumerable.Repeat(“*****”,9))
??????????? {????????????
??????????????? Console.WriteLine(num);
??????????? }
?10.轉換操作符:將輸入對象類型轉變為序列的動作。
(1)AsEnumerable:
(2)Cast:將序列轉換成指定的類型。
(3)OfType:過濾序列中的某種類型。
(4)ToArray:從IEnumerable序列創建一個數組。
(5)ToDictionary:從IEnumerable序列創建一個Dictionary序列。
(6)ToList:從IEnumerable序列創建一個List序列。
(7)ToLookup:從IEnumerable序列創建一個 Lookup序列。Lookup是主鍵的集合,其中主鍵對應著一個或多個值。
class OrderTable
??? {
??????? public int OrderNum
??????? { get; set; }
??????? public double Amount
??????? { get; set; }
??? }
??????????? List<OrderTable> list = new List<OrderTable>();
??????????? list.Add(new OrderTable { OrderNum = 1001, Amount = 1234.5 });
??????????? list.Add(new OrderTable { OrderNum = 1002, Amount = 2340 });
??????????? list.Add(new OrderTable { OrderNum = 1001, Amount = 3000 });
??????????? var lis = list.ToLookup(num => num.OrderNum, num => num.Amount);
??????????? foreach (var item in lis)
??????????? {
??????????????? Console.WriteLine("訂單號:{0}",item.Key );
??????????????? foreach (var v in item)
??????????????? {
??????????????????? Console.WriteLine("? {0}元",v);
??????????????? }
??????????? }
?11.元素操作符:從一個序列返回單個特定的元素。
(1)DefaultIfEmpty:將空集合替換為包含默認的單個值的集合。
(2)ElementAt:返回集合中給定索引的元素。
(3)ElementAtOrDefault:是將ElementAt和DefaultIfEmpty。
(4)First:返回集合中的第一個元素(Last返回最后一個)。
(5)FirstOrDefault:返回集合中的第一個元素,如果不存在,返回默認值(LastOrDefault返回最后一個,如果不存在,返回默認值)。
(6)Single:從一個序列中返回單個元素,或唯一滿足某一特定條件的元素。(LastOrDefault返回最后一個,如果不存在,返回默認值)。
(7)SingleOrDefault:從一個序列中返回單個元素,或唯一滿足某一特定條件的元素。如果存在多條記錄,拋出異常。
var value = list.Where (li=>li.OrderNum ==1002).Select(lis=>lis.OrderNum).Single();??????????
?12.相等操作符:比較兩個序列的元素是否相同。
(1)SequenceEqual
?int[] Arr1 = { 1, 2, 3 };
??????????? int[] Arr2 = { 1, 2, 3 };
??????????? Console.WriteLine(Arr1.SequenceEqual(Arr2))
13.量詞操作符:是否存在部分或全部元素符合某個特定條件。
(1)All:判定在集合中是否所有的值都滿足特定的條件。
??????????? int[] Arr1 = { 1, 1, 1 };
Console.WriteLine(Arr1.All (arr=>arr==1));
(2)Any:判定在集合中是否有的值滿足特定的條件。
??????????? int[] Arr1 = { 1, 2, 3 };
??????????? Console.WriteLine(Arr1.Any (arr=>arr==1));
(3)Contains:判定在集合中是否包含某個值。
??????????? int[] Arr1 = { 1, 2, 3 };
??????????? Console.WriteLine(Arr1.Contains(4));
14.分割操作符:將一個序列分割成兩個或多個序列。
(1)Skip:跳過序列的前n個元素后返回所有的元素。
???????????
int[] Arr = { 1, 2, 3,4,5,6 };
??????????? foreach (int i in Arr.Skip(2))
??????????? {
??????????????? Console.WriteLine(i);
??????????? }
(2)SkipWhile:跳過不滿足條件的元素,返回余下元素的序列。
??????????? 需要注意的是,這種跳出過必需排序后才能全部跳過滿足條件的元素。
? int[] Arr = { 1, 12, 3,4,15,6};
??????????? foreach (int i in Arr.OrderBy (nu=>nu).SkipWhile(arr=>arr<=10))
??????????? {
??????????????? Console.WriteLine(i);
??????????? }
(3)Take:返回序列的從開始到參數指定位置的元素。
?int[] Arr = { 1, 2, 3,4,5,6 };
??????????? foreach (int i in Arr.Take(2))
??????????? {
??????????????? Console.WriteLine(i);
??????????? }
(4)TakeWhile:返回滿足條件的元素。
??????????? 需要注意的是,這種返回必需排序后才能進行操作。
? int[] Arr = { 1, 12, 3,4,15,6};
??????????? foreach (int i in Arr.OrderBy (ar=>ar).TakeWhile(arr=>arr<12))
??????????? {
??????????????? Console.WriteLine(i);
??????????? }
總結:
查詢語法就是 :from 表名 where 條件 select 所需要的列名
方法語法就是:表名.where(條件).select(所需要的列名)
?
?
?
轉載于:https://blog.51cto.com/zhjjzhjj/386646
總結
- 上一篇: 在虚拟机上安装XP系统
- 下一篇: Time zone BOGUS not