Lambda表達式簡介:
MSDN定義:Lambda 表達式是一種可用于創(chuàng)建委托或表達式目錄樹類型的匿名函數(shù)。
介紹
1.lambda表達式是匿名函數(shù)君旦,只不過長得不太像而已,可以看成是進化版嘲碱。
2.lambda表達式是用來創(chuàng)建委托或者目錄樹的匿名函數(shù)
使用場景:
可以在需要委托值的任何地方(也就是在可以使用匿名方法的任何地方)使用這些表達式金砍。
我的理解:
其實Lambda表達式就是匿名方法。
其中使用Lambda表達式來創(chuàng)建委托實例麦锯,我們卻沒有指出創(chuàng)建的委托類型恕稠,其中編譯器會幫助我們?nèi)ネ茢辔蓄愋停瑥亩喕覀儎?chuàng)建委托類型所需要的代碼扶欣,從而更加簡潔鹅巍。
所以Lambda表達式可以總結(jié)為——它是在匿名方法的基礎(chǔ)上千扶,再進一步地簡化了創(chuàng)建委托實例所需要的代碼。
匿名方法可以簡明的忽略參數(shù)昆著,但Lambda表達式不具備這一特性县貌。
Button btn=new Button();
Btn.Text=“click me”;
Btn.Click+=delegate{console.WriteLine(“LogPlain”);};//忽略了我們經(jīng)常使用的參數(shù)delegate(object sender,EventArgs e){…}
Lambda表達式使用演示
static void Main(string[] args)
{
// Lambda表達式的演變過程
// 下面是C# 1中創(chuàng)建委托實例的代碼
Func<string, int> delegatetest1 = new Func<string, int>(Callbackmethod);
// ↓
// C# 2中用匿名方法來創(chuàng)建委托實例,此時就不需要額外定義回調(diào)方法Callbackmethod
Func<string, int> delegatetest2 = delegate(string text)
{
return text.Length;
};
// ↓
// C# 3中使用Lambda表達式來創(chuàng)建委托實例
Func<string, int> delegatetest3 = (string text) => text.Length;
// ↓
// 如果Lambda表達式只需一個參數(shù)凑懂,并且那個參數(shù)可以隱式指定類型時煤痕,
// 此時可以把圓括號也省略,簡化為:
Func<string, int> delegatetest = text => text.Length;
// 調(diào)用委托
Console.WriteLine("使用Lambda表達式返回字符串的長度為: " + delegatetest("learning hard"));
Console.Read();
}
/// <summary>
/// 回調(diào)方法
/// 如果使用了Lambda表達式和匿名函數(shù),此方法就不需要額外定義
/// </summary>
/// <param name="text"></param>
/// <returns></returns>
private static int Callbackmethod(string text)
{
return text.Length;
}
Lambda結(jié)合Action和Func的使用
Action<string> action = (str) => Console.WriteLine("Task={0}, str={1}, Thread={2}", Task.CurrentId, str, Thread.CurrentThread.ManagedThreadId);
Func<int, int> negate =(n) =>{
Console.WriteLine("Task={0}, n={1}, Thread={2}", Task.CurrentId, n, Thread.CurrentThread.ManagedThreadId);
return -n;
};
Task<int>.Factory.StartNew(() => negate(6))
.ContinueWith(f => action("x"))
.Wait();
Lambda表達式的使用
主要的是在Linq表達式的使用接谨,以及對擴展方法上的運用等
例如:
List list=new List();
list.Add(2);
list.Add(3);
list.Where(x=>x%2==0);
where方法其實就是一個擴展方法
public static IEnumerable<TSource> Where<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate);
總結(jié)
- 匿名函數(shù)不等于匿名方法摆碉,匿名函數(shù)包含了匿名方法和lambda表達式這兩種概念。
匿名函數(shù):{匿名方法脓豪,lambda表達式}
2.lambda作為表達式巷帝,可以被C#編譯器轉(zhuǎn)換為委托,也可以被編譯器轉(zhuǎn)換為表達式樹扫夜,匿名方法只能轉(zhuǎn)換為委托楞泼。
兩者的共通點是都能被編譯器轉(zhuǎn)換成為委托,lambda表達式能完成幾乎所有匿名方法能完成的事笤闯。
延伸
Linq查詢操作符
string[] words = { "zero","one", "two", "three", "four" };
int[] numbers = { 0, 1, 2, 3, 4 };
1.聚合
numbers.Sum();
numbers.Average();
numbers.Count();
numbers.LongCount(x => x % 2 == 0);
words.Min();
words.Max();
numbers.Aggregate((a, b) => (a + b));
2.鏈接
numbers.Concat(new[] { 2, 3, 4, 5, 6 });
3.轉(zhuǎn)換
words.Cast<string>() //遍歷時遇到轉(zhuǎn)換失敗的地方堕阔,會拋出異常
words.OfType<string>()
numbers.ToArray();
numbers.ToList();
words.ToDictionary(w => w.Substring(0, 2));
numbers.Concat(new[] { 2, 3, 4, 5, 6 });
4.元素操作符
words.ElementAt(2);
words.ElementAtOrDefault(10);
words.First();
words.First(w => w.Length == 3);
words.First(w => w.Length == 10); //異常:沒有匹配的元素
words.FirstOrDefault (w => w.Length == 10); //null
words.Last(); //"four“
words.Single(); //異常:不止一個元素
words.SingleOrDefault(); //異常:不止一個元素
words.Single(word => word.Length == 5); //“three“ 返回唯一元素
words.Single(word => word.Length == 10); //異常:沒有匹配的元素
words.SingleOrDefault(w => w.Length == 10); //null 返回唯一元素
5.相等操作
words.SequenceEqual(new[]{“ZERO”,“ONE”,“TWO”,“THREE”,“FOUR”},StringComparer.OrdinalIgnoreCase);
6.生成
numbers.DefaultIfEmpty(); //0, 1, 2, 3, 4
Enumerable.Range(0, 100);
Enumerable.Repeat(25, 2);//生成包含重復(fù)值的序列
Enumerable.Empty<int>();//生成任意類型的空序列
7.分組
words.GroupBy(word => word.Length);
8.連接
words.Join(allStrings, name => name[0], color => allStrings[0],(name, color) => name + " - " + color);
words.GroupJoin
9.分部
words.Take(2); //"zero", "one"
words.Skip(2); //"two","three", "four"
words.TakeWhile(word => word.Length <= 4); //"zero", "one", "two"
words.SkipWhile(word => word.Length <= 4); //"three","four“
10.投影
words.Select(word => word.Length);// 4, 3, 3, 5, 4
words.Select((word, index) => index.ToString() + ": " + word); //"0: zero", "1: one", "2: two","3: three", "4: four"
words.SelectMany(word => word.ToCharArray());//'z', 'e', 'r', 'o', 'o', 'n', 'e', 't', 'w', 'o', 't','h', 'r', 'e', 'e', 'f', 'o', 'u', 'r'
11.數(shù)量
words.All(word => word.Length > 3); //false("one"和"two"的確包含3個字母)
words.All(word => word.Length > 2); //true
words.Any(); //true(序列不為空)
words.Any(word => word.Length == 6); //false(沒有6個字母的單詞)
words.Any(word => word.Length == 5); //true("three"滿足這個條件)
words.Contains("FOUR"); //false
words.Contains("FOUR",StringComparer.OrdinalIgnoreCase); //true
12.過濾
words.Where(word => word.Length > 3); //"zero", "three", "four“
13.基于集的操作符
"abbc".Distinct(); //"a", "b", "c"
"abbc".Intersect("cd"); //"c"
"abbc".Union("cd");//"a", "b", "c", "d"
"abbc".Except("cd"); //"a", "b"
"cd".Except("abc"); //"d“
14.排序
words.OrderBy(word => word);
words.Reverse();
words.OrderByDescending(word => word.Length);
有部分內(nèi)容是摘抄的深入淺出C#,附上PDF下載。