2018年7月4日 星期三

[C#] Action、Func、Predicate、delegate委派與Lambada運算式

Lambada運算式:匿名函式的表示方法。

(傳入參數) => { 執行程式 }

Action委派:無傳回值的泛型委派,至少0個參數,至多16個參數。

Action:表示無參數的委派。

Action<int>:表示傳入int參數的委派。

Action<int, string>:表示傳入int、string參數的委派。

public class Program
{
   public static void Main(string[] args)
   {
      //委派給匿名函式
      Action Combine1 = (string x, string y) => {
         Console.WriteLine(x + "‧" + y);
      };
      Combine1("Jerry", "Haung");

      //委派給具名函式
      Action Combine2 = Program.CombineString;
      Combine2("Mike", "Liu");
   }

   public static void CombineString(string x, string y)
   {
      Console.WriteLine(x + "‧" + y);
   }
}

Func委派:有傳回值的泛型委派

Func<int>:表示無參數,回傳int的委派。

Func<int, string>:表示傳入int參數,回傳string的委派。

Func<int, int, string>:表示傳入int、int參數,回傳string的委派。

public class Program
{
   public static void Main(string[] args)
   {
      //委派給匿名函式
      Func Add1 = (int x, int y) =>
      {
         return (x + y).ToString();
      };
      Console.WriteLine(Add1(50, 50));

      //委派給具名函式
      Func Add2 = Program.AddInteger;
      Console.WriteLine(Add2(10, 20));
   }

   public static string AddInteger(int x, int y)
   {
      return (x + y).ToString();
   }
}

Predicate委派:回值布林值的泛型委派,只有1個參數。

public static void Main(string[] args)
{
   //委派找出正整數
   Predicate PositiveInteger = (int x) => {
      return x > 0;
   };

   //委派找出中性數-委派給具名函式
   Predicate Zero = Program.IsZero;

   //委派找出負整數
   Predicate NegativeInteger = (int x) => {
      return x < 0;
   };

   //執行委派
   bool isPositive = PositiveInteger(50);
   Console.WriteLine(isPositive);

   //執行委派參數方法
   int[] array = { 1,3,5,7,0,-2,-4,-6,-8, 0 };
   var PositiveList = MyFind(array, PositiveInteger);
   var NegativeList = MyFind(array, NegativeInteger);
   var ZeroList = MyFind(array, Zero);

   Console.WriteLine(JsonConvert.SerializeObject(PositiveList));
   Console.WriteLine(JsonConvert.SerializeObject(NegativeList));
   Console.WriteLine(JsonConvert.SerializeObject(ZeroList));

   Console.ReadKey();
}

//找出中性數
public static bool IsZero(int x)
{
   return x == 0;
}

//傳入委派參數方法
public static IEnumerable MyFind(int[] array, Predicate predicate)
{
   foreach (var item in array)
   {
      if (predicate(item))
      {
         yield return item;
      }
   }
}

delegate委派:一種委派聲明,至少0個參數,至多32個參數,可以無傳回值,也可以指定傳回值類型。

public class Program
{
   //宣告delegate委派
   public delegate string AddDelegate(int x, int y);

   public static void Main(string[] args)
   {
      //委派給匿名函式
      AddDelegate Add1 = (int x, int y) => {
         return (x + y).ToString();
      };
      Console.WriteLine(Add1(30, 50));

      //委派給具名函式
      AddDelegate Add2 = Program.AddInteger;
      Console.WriteLine(Add2(10, 20));
   }

   public static string AddInteger(int x, int y)
   {
      return (x + y).ToString();
   }
}

沒有留言:

張貼留言