程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C#中Predicate<T>與Func<T, bool>泛型拜托的用法實例

C#中Predicate<T>與Func<T, bool>泛型拜托的用法實例

編輯:C#入門知識

C#中Predicate<T>與Func<T, bool>泛型拜托的用法實例。本站提示廣大學習愛好者:(C#中Predicate&lt;T&gt;與Func&lt;T, bool&gt;泛型拜托的用法實例)文章只能為提供參考,不一定能成為您想要的結果。以下是C#中Predicate&lt;T&gt;與Func&lt;T, bool&gt;泛型拜托的用法實例正文


本文以實例情勢剖析了C#中Predicate<T>與Func<T, bool>泛型拜托的用法,分享給年夜家供年夜家參考之用。詳細以下:

先來看看上面的例子:

static void Main(string[] args)  
{  
  List<string> l = new List<string>();  
  l.Add("a");  
  l.Add("b");  
  l.Add("s");  
  l.Add("t");  
 
  if (l.Exists(s => s.Equals("s")))  
  {  
    string str = l.First(s => s.Equals("s"));  
    Console.WriteLine(str);  
  }  
  else 
    Console.WriteLine("Not found");  
}  

異常簡略,就是先斷定字符串列表l中能否有s字符串,假如有,則取之並顯示出來。從代碼中可以看到,l.Exists辦法和l.First辦法所應用的參數是雷同的,但現實能否真是如斯?

現實上,List<T>.Exists和List<T>.First的參數分離應用了分歧的拜托:
Predicate<T>和Func<T, bool>。從函數的簽名上看,二者沒有差別,都是指代的參數類型為T,前往值為bool的函數,但究竟二者屬於分歧的拜托類型,是以,上面的代碼明顯是沒法編譯經由過程的:

static void Main(string[] args)  
{  
  List<string> l = new List<string>();  
  l.Add("a");  
  l.Add("b");  
  l.Add("s");  
  l.Add("t");  
  Func<string, bool> p = s => s.Equals("s");  
  if (l.Exists(p))  
  {  
    string str = l.First(p);  
    Console.WriteLine(str);  
  }  
  else 
    Console.WriteLine("Not found");  
}  

但是,因為Predicate<T>和Func<T, bool>切實其實指代的是統一類具有雷同簽名的函數,而我們常常又不願望將匿名辦法的辦法體反復地寫兩次以分離付與Predicate<T>和Func<T, bool>泛型拜托,是以,我們可以本身寫一個擴大辦法,擴大Func<T, bool>類型以使其可以或許很便利的轉換成Predicate<T>類型:

public static class Extensions  
{  
  public static Predicate<T> ToPredicate<T> (this Func<T, bool> source)
  {  
    Predicate<T> result = new Predicate<T>(source);  
    return result;  
  }  
}  

在引入了這個擴大辦法以後,我們的代碼便可以寫成上面的情勢:

static void Main(string[] args)  
{  
  List<string> l = new List<string>();  
  l.Add("a");  
  l.Add("b");  
  l.Add("s");  
  l.Add("t");  
  Func<string, bool> p = s => s.Equals("s");  
  if (l.Exists(p.ToPredicate()))  
  {  
    string str = l.First(p);  
    Console.WriteLine(str);  
  }  
  else 
    Console.WriteLine("Not found");  
}  

說真話不知為什麼MS要用如許兩種完整分歧的泛型拜托來完成Exists和First辦法,這使得某些情形下代碼變得絕對龐雜,乃至輕易失足。我想年夜概是為了語義清楚的原因,Exists不外是做斷定,是以須要用斷言表達式,而在做First操作的時刻,則更多的意義上是在迭代地挪用指定的辦法。學無盡頭,有待持續摸索。

願望本文所述對年夜家的C#法式設計有所贊助

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved