天天看點

LINQ标準查詢操作符

1.投影操作符:将序列中的元素轉換為一個由開發人員定義的形式的操作。

Select :對單個序列或集合中的值進行投影。

string[] Devices = { "電視", "電冰箱", "洗衣機", "電話", "微波爐" }; var SelectDevices1 = from device in Devices select device; // var SelectDevices = Devices.Select(device=>device); foreach (string dev in SelectDevices1) { Console.WriteLine("帶電的裝置:{0}", dev); }

SelectMany:将序列的每個元素投影到 IEnumerable<(Of <(T>)>) 并将結果序列合并為一個序列。

class Devices public string Name { get; set; } public List<double> Price 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.限制操作符:按照一定的限制,對序列進行過濾。

Where:對單個序列或集合中的值進行投影。

var SelectDevices = from device in Devices where device.StartsWith("電") //var SelectDevices = Devices.Where(device=>device.StartsWith ("電")); foreach (string dev in SelectDevices)

3.排序操作符:按照升序和降序的方式對結果進行排序的功能。

OrderBy:将序列中的傳回值按照升序的順序進行排列。

orderby device // var SelectDevices = Devices.OrderBy (device => device);

OrderByDescending:将序列中的傳回值按照降序的順序進行排列。

orderby device descending // var SelectDevices = Devices.OrderByDescending(device => device);

ThenBy:排序依據的次關鍵字。

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 // var devices = DeviceGroup.AsQueryable().OrderBy(device => device.Name).ThenBy(device => device.Price); foreach (var dev in devices) Console.WriteLine("品名:{0},價格:{1}",dev.Name,dev.Price );

ThenByDescending:倒排序依據的次關鍵字。

orderby device.Name,device .Price descending // var devices = DeviceGroup.AsQueryable().OrderBy(device => device.Name).ThenByDescending(device => device.Price);

Reverse:反轉序列。

var SelectDevices = from device in Devices.Reverse() //var SelectDevices = Devices.Select(device=>device).Reverse ();

4.聯接操作符:将兩個或多個資料源對象進行關聯或聯合。

Join:按照一定的條件,将兩個資料源關聯起來。

<a href="http://axzxs.blog.51cto.com/attachment/200908/24/730810_1251079285vL9P.jpg"></a>

List&lt;StudentMessage&gt; A_Class = new List&lt;StudentMessage&gt;(); //聲名一個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 });//添加學員 A_Class.Add(new StudentMessage { ID = 1003, Name = "王五", Sex = true, Age = 19 }); //添加學員 List&lt;StudentScort&gt; A_ScortSheet = new List&lt;StudentScort&gt;(); //聲名一個成績表 A_ScortSheet.Add(new StudentScort { ID = 1001, ChineseScort = 90f, MathsScort = 88f }); //添加學員成績 A_ScortSheet.Add(new StudentScort { ID = 1002, ChineseScort = 80f, MathsScort = 68f }); //添加學員成績 A_ScortSheet.Add(new StudentScort { ID = 1003, ChineseScort = 60f, MathsScort = 98f }); //添加學員成績 var messages = from mes in A_Class join sco in A_ScortSheet on mes.ID equals sco.ID select new { mes.ID, mes.Name, sco.ChineseScort, sco.MathsScort }; //var messages=A_Class.Join (A_ScortSheet ,mes=&amp;gt;mes .ID ,sco=&amp;gt;sco.ID ,(mes,sco)=&amp;gt;new {mes.ID, mes.Name, sco.ChineseScort, sco.MathsScort }); Console.WriteLine("{0,4} {1,10} {2,3} {3,3}", "學号","姓名","國文","數學"); foreach (var scort in messages) Console.WriteLine("{0,6} {1,10} {2,4} {3,4}",scort .ID ,scort .Name ,scort.ChineseScort ,scort .MathsScort );

GroupJoin:将主資料源中的每一個值或元素與次資料源中相應的值聯接起來。

<a href="http://axzxs.blog.51cto.com/attachment/200908/24/730810_1251079291Wmnx.jpg"></a> A_Class.Add(new StudentMessage { ID = 1002, Name = “李四”, Sex = false, Age = 21 });//添加學員 List&lt;Scort&gt; A_ScortSheet = new List&lt;Scort&gt;(); //聲名一個成績表 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 =&amp;gt; mes.ID, sco =&amp;gt; sco.ID, (mess, scor) =&amp;gt; new { Mess = mess.ID, Mename = mess.Name, Scor = scor.Select(Scor =&amp;gt; Scor) }); 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=&amp;gt;資料源1.關聯字段,變量2=&amp;gt;資料源碼2.關聯字段,(資料源1資料變量,資料源2資料清單變量)=&amp;gt;new{變量a=資料源1.字段1,變量b=資料源1.字段2,變量c=資料源2清單變量.Select(變量c=變量c)})

5.分組操作符:按照一定的值将序列中的值或元素進行分組。

GroupBy:将序列中的傳回值按照升序的順序進行排列。

class Student public string ClassName 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 =&amp;gt; st.ClassName); //var stus = students.GroupBy(st =&amp;gt; st.ClassName); foreach (var v in stus) Console.WriteLine("{0}班學生:", v.Key); foreach (var va in v) Console.WriteLine(" 姓名:{0}", va.Name);

6.合并操作符:将兩個對象合并在一起。

Concat:

string[] Citys = new string[] { "北京","上海","東京"}; string[] Mobiles = new string[] {"諾基亞","摩托羅拉","三星" }; var Cont = Citys.Select(city =&amp;gt; city).Concat(Mobiles.Select(mobil =&amp;gt; mobil)); foreach (var v in Cont)

7.聚合操作符:在一系列值上執行特定的運算,并傳回單個值。

Aggregate:從序列或集合中收集值。

string[] citys = {"北京","上海","東京"}; string newcity = citys.Aggregate((cityname,next)=&amp;gt;next+"-"+cityname); Console.WriteLine(newcity);

Average:求一個數值序列的平均值。

Demo1: double[] nums = {1.2,34.1,45.21,43.1 }; Console.WriteLine(nums.Average ()); Demo2: List&lt;StudentSoc&gt; list = new List&lt;StudentSoc&gt;(); list.Add(new StudentSoc { Name = "張三", Chinese = 90f }); list.Add(new StudentSoc { Name = "李四", Chinese = 94f }); list.Add(new StudentSoc { Name = "王五", Chinese = 92f }); list.Add(new StudentSoc { Name = "趙六", Chinese = 78f }); var quer = from stu in list select stu.Chinese; Console.WriteLine(quer .Average ()); //var quer = list.Average(lis=&amp;gt;lis.Chinese ); //Console.WriteLine(quer);

Count:求一個數值序列的個數。(LongCount用法相同)

Console.WriteLine(nums.Count(num=&amp;gt;num&lt;10)); List&amp;lt;StudentSoc&gt; list = new List&lt;StudentSoc&gt;(); var quer = from stu in list where stu.Chinese &amp;gt;80 select stu.Chinese; Console.WriteLine(quer.Count()); //var quer = list.Count(lis=&amp;gt;lis.Chinese &amp;gt;80);

Sum:求一個數值序列的和。

Console.WriteLine(nums.Where (numm=&amp;gt;numm&amp;gt;10).Sum(num=&amp;gt;num)); where stu.Chinese &lt; 93 Console.WriteLine(quer.Sum()); //var quer = list.Where(liss =&gt; liss.Chinese &lt; 93).Sum(lis =&gt; lis.Chinese); // Console.WriteLine(quer);

8.集合操作符:對元素的集合或序列集合進行操作,并近觀回一個集合。

Distinct:删除集合中重複的值,并傳回該項集合中互不相同的元素。

StudentSoc s = new StudentSoc { Name = "趙六", Chinese = 78f }; list.Add(s); //var quer = from stu in list // select stu; //foreach (var que in quer.Distinct()) //{ // Console.WriteLine(que.Name +":"+que.Chinese ); //} var quer = list.Distinct(); foreach (var que in quer) Console.WriteLine(que.Name + ":" + que.Chinese);

Union:将兩個集合或序列合并後傳回不同的元素。

int[] nums1 = {1,2,3,3,4}; int[] nums2 = { 2, 3, 4, 5, 6 }; var newnums = nums1.Union(nums2); foreach (var num in newnums) Console.WriteLine(num);

Intersect:傳回兩個集合的交集。

var newnums = nums1.Intersect(nums2);

Except:傳回序列一中序列二沒有的值。

int[] nums1 = {1,2,3,3,4,7}; int[] nums2 = { 2, 3, 4, 5, 6 ,9,23}; var newnums = nums1.Except(nums2);

9.生成操作符:從現有的序列中建立新的序列。

Empty:指定類型的空集。

var s= Enumerable.Empty&lt;string&gt;(); Console.WriteLine(s.Count ());

Range:建立一個包含數字序列的集合。

foreach (var num in Enumerable.Range(3, 9))

Repeat:将值重複一定的次數。

foreach (var num in Enumerable.Repeat(“*****”,9))

10.轉換操作符:将輸入對象類型轉變為序列的動作。

AsEnumerable:

int[] ArrInt = {1,2,3,4,5 }; foreach (int i in ArrInt .Where (arr=&amp;gt;arr&amp;gt;1)) Console.WriteLine(i); foreach (int i in ArrInt.AsEnumerable().Where(arr =&amp;gt; arr &amp;gt; 1))

Cast:将序列轉換成指定的類型。

直接對Array應用Select是不可以的。 ArrayList AL = new ArrayList(); AL.Add(1); AL.Add(2); AL.Add(3); AL.Add(4); IEnumerable &lt;int&gt; que=AL.Cast&lt;int&gt;().Select (arr=&amp;gt;arr); foreach (int i in que)

OfType:過濾序列中的某種類型。

AL.Add("3"); var que = AL.OfType&lt;int&gt;(); foreach (var i in que)

ToArray:從Ienumerable序列建立一個數組。

var stu1 = list.Select(stud =&amp;gt; stud.Chinese); var stu = list.Select(stud =&amp;gt; stud.Chinese).ToArray();

ToDictionary:從Ienumerable序列建立一個Dictionary序列。

class StudentSoc public float Chinese Dictionary&lt;float ,StudentSoc&gt; stu = list.ToDictionary(stud =&amp;gt; stud.Chinese ); foreach (KeyValuePair&lt;float,StudentSoc &gt; item in stu) Console.WriteLine(item.Key +" "+item.Value.Name +" "+item.Value .Chinese );

ToList:從Ienumerable序列建立一個List序列。

var stu = list.Select(lis=&amp;gt;lis.Chinese).ToList(); foreach (var item in stu) Console.WriteLine(item );

ToLookup:從Ienumerable序列建立一個 Lookup序列。Lookup是主鍵的集合,其中主鍵對應着一個或多個值。

class OrderTable public int OrderNum public double Amount List&lt;OrderTable&gt; list = new List&lt;OrderTable&gt;(); 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 =&amp;gt; num.OrderNum, num =&amp;gt; num.Amount); foreach (var item in lis) Console.WriteLine("訂單号:{0}",item.Key ); foreach (var v in item) Console.WriteLine(" {0}元",v);

11.元素操作符:從一個序列傳回單個特定的元素。

DefaultIfEmpty:将空集合替換為包含預設的單個值的集合。

var lis = list.Where(num =&amp;gt; num.OrderNum == 1001); foreach (var item in lis.DefaultIfEmpty(new OrderTable { OrderNum =0,Amount =0})) Console.WriteLine("訂單号:{0}", item.Amount);

ElementAt:傳回集合中給定索引的元素。

var value = list.Where(num =&amp;gt; num.OrderNum == 1001).ElementAt (1); Console.WriteLine("訂單号:{0}", value.Amount );

ElementAtOrDefault:是将ElementAt和DefaultIfEmpty。

var value = list.Select (lis=&amp;gt;lis.OrderNum).ElementAtOrDefault(3); Console.WriteLine("訂單号:{0}", value);

First:傳回集合中的第一個元素(Last傳回最後一個)。

var value = list.Select (lis=&amp;gt;lis.OrderNum).First ();

FirstOrDefault:傳回集合中的第一個元素,如果不存在,傳回預設值(LastOrDefault傳回最後一個,如果不存在,傳回預設值)。

var value = list.Where (li=&amp;gt;li.OrderNum ==1003).Select(lis=&amp;gt;lis.OrderNum).FirstOrDefault();

Single:從一個序列中傳回單個元素,或唯一滿足某一特定條件的元素。(LastOrDefault傳回最後一個,如果不存在,傳回預設值)。

var value = list.Where (li=&amp;gt;li.OrderNum ==1002).Select(lis=&amp;gt;lis.OrderNum).Single();

SingleOrDefault:從一個序列中傳回單個元素,或唯一滿足某一特定條件的元素。如果存在多條記錄,抛出異常。

var value = list.Where (li=&amp;gt;li.OrderNum ==1001).Select(lis=&amp;gt;lis.OrderNum).SingleOrDefault();

12.相等操作符:比較兩個序列的元素是否相同。

SequenceEqual

int[] Arr1 = { 1, 2, 3 }; int[] Arr2 = { 1, 2, 3 }; Console.WriteLine(Arr1.SequenceEqual(Arr2))

13.量詞操作符:是否存在部分或全部元素符合某個特定條件。

All:判定在集合中是否所有的值都滿足特定的條件。

int[] Arr1 = { 1, 1, 1 }; Console.WriteLine(Arr1.All (arr=&amp;gt;arr==1));

Any:判定在集合中是否有的值滿足特定的條件。

Console.WriteLine(Arr1.Any (arr=&amp;gt;arr==1));

Contains:判定在集合中是否包含某個值。

Console.WriteLine(Arr1.Contains(4));

14.分割操作符:将一個序列分割成兩個或多個序列。

Skip:跳過序列的前n個元素後傳回所有的元素。

int[] Arr = { 1, 2, 3,4,5,6 }; foreach (int i in Arr.Skip(2))

SkipWhile:跳過不滿足條件的元素,傳回餘下元素的序列。

需要注意的是,這種跳出過必需排序後才能合部跳過滿足條件的元素。 int[] Arr = { 1, 12, 3,4,15,6}; foreach (int i in Arr.OrderBy (nu=&amp;gt;nu).SkipWhile(arr=&amp;gt;arr&lt;=10))

Take:傳回序列的從開始到參數指定位置的元素。

foreach (int i in Arr.Take(2))

TakeWhile:傳回滿足條件的元素。

需要注意的是,這種傳回必需排序後才能進行操作。 foreach (int i in Arr.OrderBy (ar=&gt;ar).TakeWhile(arr=&amp;gt;arr&amp;lt;12)) 本文轉自桂素偉51CTO部落格,原文連結:  http://blog.51cto.com/axzxs/195102 ,如需轉載請自行聯系原作者

繼續閱讀