1. 程式人生 > >C# Lambda的用法

C# Lambda的用法

C# Lambda的用法

我們過去遇到迴圈問題都是用foreach和for,慢慢就成了習慣,不願意用其他簡便的方式,lambda能代替迴圈而且簡便了很多。

1:什麼是lambda表示式

Lambda 表示式是一種可用於建立委託或表示式目錄樹的匿名函式(摘自MSDN)這句話是什麼意思下面慢慢開始說起

2:用一張圖來表示lambda的組成

 

就是形如(引數)=>{操作}

3:委託和lambda的用法

首先定義三個委託:

private delegate string DelLambda();//沒有引數
private delegate void DelLambdaOne(string Param);//一個引數
private delegate int DelLambdaTwo(int Param1, int param2);//兩個引數表達多個

A:沒有任何引數

 

public static void NoParam()
{
DelLambda delLambda = () =>
{
return "1"; 
};
Console.WriteLine("我沒有引數 返回值:{0}",delLambda());
}

 

執行結果:

B:只有一個引數的

 

 public static void OneParam()
        {
            DelLambdaOne delLambdaOne = p =>
            {
                Console.WriteLine(p);
            };
            delLambdaOne("哈哈我只有一個引數");
        }

執行結果:

 

C:2個以上引數

public static void TwoParam() { DelLambdaTwo delLambdaTwo = (p1, p2) => { return p1*p2; }; Console.WriteLine("{0}*{1}={2}",10,2,delLambdaTwo(10,2)); }

 

執行結果

4:Func和lambda的用法

上一篇說了Func的用法,和lamdba更加簡化了程式碼量,此時就不用像上面一樣就行宣告委託直接可以用(關於action和func很像不舉例了)

看下程式碼

 

  public static void LambdaFunc()
        {
            Func<string, string, string> getFunc = (p1, p2) =>
            {
                return p1 + "    " + p2;
            };
            Console.WriteLine(getFunc("我是第一個引數","我是第二個引數"));
        }

 

看下結果:

5:linq和lambda一起的用法(部分)

A:遍歷的用法

   public string LambdaAndEach()
        {
            List<int> retList = CreateIisList();
            StringBuilder sbBuilder = new StringBuilder();
            retList.ForEach(p =>
            {
                if (p == retList[retList.Count - 1])
                {
                    sbBuilder.Append("'" + p);
                }
                else
                {
                    sbBuilder.Append("'" + p + "',");
                }
            });
            return sbBuilder.ToString();
        }

註釋1:CreateIisList()是生成一個list的方法

看下結果:

B:where篩選和查詢的用法

 

   public void LambdaAndWhere()
        {
            List<User> Users = GetList();
            List<int> retList = CreateIisList();
            List<int> aaList=new List<int>();
            //獲取所有的使用者ID
            List<string> gidList = Users.Select(p => p.Gid).ToList();
           //獲取所有大於6的集合
            aaList = retList.Where(p => p > 6).ToList();
            Console.WriteLine("獲取所有使用者ID集合{0}", string.Join(" ",gidList.ToArray()));
            Console.WriteLine("獲取所有大於6的集合{0}", string.Join(" ", aaList.ToArray()));
        }

 

   public List<User> GetList()
        {
            User User1 = new User() {Gid = Guid.NewGuid().ToString(), UserName = "admin", Pwd = "123456"};
            User User2 = new User() { Gid = Guid.NewGuid().ToString(), UserName = "zhangsan", Pwd = "zhangsan" };
            User User3 = new User() { Gid = Guid.NewGuid().ToString(), UserName = "lisi", Pwd = "lisi" };
            User User4 = new User() { Gid = Guid.NewGuid().ToString(), UserName = "wangwu", Pwd = "wangwu" };
            List<User> users = new List<User>();
            users.Add(User1);
            users.Add(User2);
            users.Add(User3);
            users.Add(User4);
            return users;
        }

 

看下結果:

6:表示式目錄樹用法

 

這是一個操作的目錄樹然後用程式碼執行

 

    ParameterExpression a = Expression.Parameter(typeof(int), "a");//建立一個表示式樹中的引數,作為一個節點(就是圖中的a)
            ParameterExpression b = Expression.Parameter(typeof(int), "b");
            BinaryExpression ab = Expression.Multiply(a, b);//這就是圖中的ab由a和b相乘得到的ab節點

            ParameterExpression c = Expression.Parameter(typeof(int), "c");
            ParameterExpression d = Expression.Parameter(typeof(int), "d");
            BinaryExpression cd = Expression.Multiply(c, d);

            BinaryExpression abcd = Expression.Multiply(ab, cd);//這是由ab和cd相乘得到目前程式中的終節點
            //abcd表示操作的程式,後面的表示引數
            Expression<Func<int, int, int, int, int>> lambda = Expression.Lambda<Func<int, int, int, int, int>>(abcd, a, b, c, d);
            Console.WriteLine(lambda + "");
            //編譯,生成委託
            Func<int, int, int, int, int> result = lambda.Compile();
            Console.WriteLine(result(2,2,2,2));

 

執行結果: