[C#]Linq的lambda expression特殊或少用的用法筆記
前言
其實在於lambda表達式的操作,筆者使用到的不外乎就是幾個而已,但其實lambda提供了非常多的,有些筆者甚至根本都沒有用過,或者很少用到要用就又忘了,但大家都知道有些並不是用不到,而是你根本沒去了解過,但如果你沒去了解過的話,問題來了的時候,你也不會想到能這樣解決,所以想要筆記一下以後可以供個人參考。
導覽
- let(臨時定義一個變數)
- SqlMethods
- TakeWhile(取到滿足條件前的)
- SkipWhile(略過滿足條件前的)
- Concat(結合兩個陣列)
- Union(結合兩個陣列排除不同值)
- Intersect(兩個陣列比較留相同值)
- Except(兩個陣例比較排要比較陣列相同值)
- Zip(兩個陣列合併處理)
- ElementAt(取第幾個陣列的意思)
- Average(取平均值)
- Aggregate(類似sum,但可以多丟一個值進去做處理)
- SequenceEqual(可以比較陣列的值是否相同)
這語法是linq語法用的,如果希望臨時定義一個變數代表一個值的話
var names = new[] { "Tom", "Dick", "Harry", "Mary", "Jay" };
var query =
from n in names
where n.Length > 3
let u = n.ToUpper()
where u.EndsWith ("Y")
select u;
query.Dump();
只適用於Entity的部份,目前提供有like或日期相關的
Customers.Where (c => SqlMethods.Like (c.Name, "%y"))
取到滿足條件前的
int[] numbers = { 3, 5, 2, 234, 4, 1 };
numbers.TakeWhile (n => n < 100).Dump ();
結果
3 |
5 |
2 |
略過滿足條件前的
int[] numbers = { 3,234, 5, 2, 4, 1 };
numbers.SkipWhile (n => n < 100).Dump ();
234 |
5 |
2 |
4 |
1 |
int[] seq1 = { 1, 2, 3 }, seq2 = { 3, 4, 5 };
seq1.Concat (seq2).Dump ("Concat");
結果
|
int[] seq1 = { 1, 2, 3 }, seq2 = { 3, 4, 5 };
seq1.Union (seq2).Dump ("Union");
結果
|
int[] seq1 = { 1, 2, 3 }, seq2 = { 3, 4, 5 };
seq1.Intersect (seq2).Dump ();
結果
3
int[] seq1 = { 1, 2, 3 }, seq2 = { 3, 4, 5 };
seq1.Except (seq2).Dump ();
seq2.Except (seq1).Dump ();
結果
seq1
|
seq2
|
這個比較難說明,也就是可以把兩個陣列合併後,做類似select的處理,不過處理完只會保留較少陣列的長度,如下例子
var letters= new string[] { "A", "B", "C", "D", "E" };
var numbers = new int[] { 1, 2, 3 };
var q = letters.Zip(numbers, (l, n) => l + n.ToString());
q.Dump();
答案
A |
B |
C |
int[] numbers = { 1, 2, 3, 4, 5 };
numbers.ElementAt (2).Dump ();
結果
3
decimal[] numbers = { 3, 4, 8 };
numbers.Average() .Dump ();
結果
5
Aggregate(類似sum,但可以多丟一個值進去做處理)
int[] numbers = { 1, 2, 3 };
numbers.Aggregate(20, (seed, n) => {
seed.Dump("seed");//seed就是傳進來的20,會隨著每次的iteration而累計
n.Dump("n");//n則是numbers的陣列
return seed + n;
}).Dump();
結果
26
var stringList = new List<string> { "anson", "kin" };
var stringList1 = new List<string> { "anson", "kin" };
stringList.SequenceEqual(stringList1).Dump();
stringList.Equals(stringList1).Dump();
結果
True
False