關於我

我的相片
用心思考、保持熱情,把工作上的經驗作分享與紀錄。希望能夠跟大家一起不斷的成長~

Delegate,AnonymousDelegate,Func,LambdaExpression,Linq演化過程程式範例

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace TestLambdaExpression2
{
  static class Program
  {
    static void Main(string[] args)
    {
      List allPerson = GetAllPerson();

      #region Func
      //1.
      Func FuncSelector = new Func(heightselector);
      Console.WriteLine(GetMaxFunc(allPerson, FuncSelector));

      //2.
      Func FuncSelector2 = heightselector;
      Console.WriteLine(GetMaxFunc(allPerson, FuncSelector2));

      //3.
      Console.WriteLine(GetMaxFunc(allPerson, heightselector)); 

      //4.
      Console.WriteLine(allPerson.GetMaxFunc(heightselector));

      //5.使用Lambda Expressions精簡Func之寫作
      Console.WriteLine(allPerson.GetMaxFunc(p => p.height));

      //6.因為Max為多型,必須先宣告形式才不會發生錯誤
      Func FuncSelector3 = heightselector;
      Console.WriteLine(allPerson.Max(FuncSelector3));
      #endregion


      #region Delegate
      //1.
      heightestSelector DelegateSelector = heightselector;
      Console.WriteLine(GetMaxDelegate(allPerson, DelegateSelector));

      //2.
      Console.WriteLine(GetMaxDelegate(allPerson, heightselector));

      //3.
      Console.WriteLine(allPerson.GetMaxDelegate(heightselector));

      //4.AnonymousDelegate
      Console.WriteLine(allPerson.GetMaxDelegate(delegate(Person p) { return p.height; }));

      //5.使用Lambda Expressions精簡AnonymousDelegate之寫作
      Console.WriteLine(allPerson.GetMaxDelegate(p => p.height));

      //6.會發生錯誤,因System.linq.Max需定義Func..不可傳入Delegate,會無法判定型式
      //heightestSelector DelegateSelector2 = heightselector;
      //Console.WriteLine(allPerson.Max(DelegateSelector2));

      //7.使用System.linq.Max,AnonymousDelegate
      Console.WriteLine(allPerson.Max(delegate(Person p) { return p.height; }));

      //8.使用System.linq.Max,Lambda Expressions精簡AnonymousDelegate之寫作
      Console.WriteLine(allPerson.Max(p => p.height));

      Man[] mans = Array.ConvertAll(allPerson.ToArray(), p => new Man() { name = p.name, weight = p.weight });
      Console.WriteLine(mans.Max(p => p.weight));
      #endregion

    }

    public delegate int heightestSelector(Person p);

    public static int heightselector(Person p) { return p.height; }

    private static int GetMaxFunc(this List allPerson, Func selector)
    {
      return (from i in allPerson
              select selector(i)).Max();
    }

    //private static decimal GetMaxFunc(this List allPerson, Func selector)
    //{
    //  return (from i in allPerson
    //          select selector(i)).Max();
    //}

    private static int GetMaxDelegate(this List allPerson, heightestSelector selector)
    {
      return (from i in allPerson
              select selector(i)).Max();
    }

    static List GetAllPerson()
    {
      List persons = new List();
      persons.Add(new Person { name = "A", height = 150, weight = 50 });
      persons.Add(new Person { name = "B", height = 160, weight = 60 });
      persons.Add(new Person { name = "C", height = 170, weight = 70 });
      persons.Add(new Person { name = "D", height = 180, weight = 80 });
      persons.Add(new Person { name = "E", height = 190, weight = 90 });
      return persons;
    }
  }

  public class Person
  {
    public string name { get; set; }
    public int height { get; set; }
    public int weight { get; set; }
  }

  public class Man
  {
    public string name { get; set; }
    public int weight { get; set; }
  }
}



沒有留言:

張貼留言