[C#]Linq的lambda expression特殊或少用的用法筆記

[C#]Linq的lambda expression特殊或少用的用法筆記

前言

其實在於lambda表達式的操作,筆者使用到的不外乎就是幾個而已,但其實lambda提供了非常多的,有些筆者甚至根本都沒有用過,或者很少用到要用就又忘了,但大家都知道有些並不是用不到,而是你根本沒去了解過,但如果你沒去了解過的話,問題來了的時候,你也不會想到能這樣解決,所以想要筆記一下以後可以供個人參考。

導覽

  1. let(臨時定義一個變數)
  2. SqlMethods
  3. TakeWhile(取到滿足條件前的)
  4. SkipWhile(略過滿足條件前的)
  5. Concat(結合兩個陣列)
  6. Union(結合兩個陣列排除不同值)
  7. Intersect(兩個陣列比較留相同值)
  8. Except(兩個陣例比較排要比較陣列相同值)
  9. Zip(兩個陣列合併處理)
  10. ElementAt(取第幾個陣列的意思)
  11. Average(取平均值)
  12. Aggregate(類似sum,但可以多丟一個值進去做處理)
  13. SequenceEqual(可以比較陣列的值是否相同)

let

這語法是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();

SqlMethods

只適用於Entity的部份,目前提供有like或日期相關的

Customers.Where (c => SqlMethods.Like (c.Name, "%y"))

TakeWhile

取到滿足條件前的

int[] numbers = { 3, 5, 2, 234, 4, 1 };
numbers.TakeWhile (n => n < 100).Dump ();

結果

3
5
2

SkipWhile

略過滿足條件前的

int[] numbers = { 3,234, 5, 2,  4, 1 };
numbers.SkipWhile (n => n < 100).Dump ();
234
5
2
4
1

Concat(結合兩個陣列)

int[] seq1 = { 1, 2, 3 }, seq2 = { 3, 4, 5 };
seq1.Concat (seq2).Dump ("Concat");

結果

1
2
3
3
4
5

Union(結合兩個陣列排除不同值)

int[] seq1 = { 1, 2, 3 }, seq2 = { 3, 4, 5 };
seq1.Union  (seq2).Dump ("Union");

結果

1
2
3
4
5

Intersect(兩個陣列比較留相同值)

int[] seq1 = { 1, 2, 3 }, seq2 = { 3, 4, 5 };
seq1.Intersect (seq2).Dump ();

結果

3

Except(兩個陣例比較排除要比較陣列相同值)

int[] seq1 = { 1, 2, 3 }, seq2 = { 3, 4, 5 };
seq1.Except    (seq2).Dump ();
seq2.Except    (seq1).Dump ();

結果

seq1

1
2

seq2

4
5

Zip(兩個陣列合併處理)

這個比較難說明,也就是可以把兩個陣列合併後,做類似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

ElementAt(取第幾個陣列的意思)

int[] numbers  = { 1, 2, 3, 4, 5 };

numbers.ElementAt (2).Dump ();

結果

3

Average(取平均值)

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

SequenceEqual(可以比較陣列的值是否相同)

var stringList = new List<string> { "anson", "kin" };
var stringList1 = new List<string> { "anson", "kin" };
stringList.SequenceEqual(stringList1).Dump();
stringList.Equals(stringList1).Dump();

結果

True
False