程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> LINQ的演變及其對C#設計的影響(3)

LINQ的演變及其對C#設計的影響(3)

編輯:關於C語言

擴展方法

顯然,擴展 方法有助於簡化我們的查詢示例,但除此之外,這些方法是不是一種廣泛有用的語言功能呢?事實證明擴展方法有多種用途。其中一個最常見的用途可能是提供共享接口實現。例如,假設您有以下接口:

interface IDog
{
 // Barks for 2 seconds
 void Bark();
 void Bark(int seconds);
}

此接口要求每個實現器都應編寫適用於兩種重載的實現。有了“Orcas”版 C#,接口變得很簡單:

interface IDog
{
 void Bark(int seconds);
}

擴展方法可添加到另一個類:

static class DogExtensions
{
 // Barks for 2 seconds
 public static void Bark(this IDog dog)
 {
  dog.Bark(2);
 }
}

接口實現器現在只需實現單一方法,但接口客戶端卻可以自由調用任一重載。

Close [x]

我們現在擁有了用於編寫篩選子句的非常接近理想的語法,但“Orcas”版 C# 僅限於此嗎?並不全然。讓我們對示例稍作擴展,相對於整個客戶對象,我們只投影出客戶名稱。如我前面所述,理想的語法應采用如下形式:

sequence locals =customers.where(ZipCode == 98112).select(Name);

僅用我們討論過的語言擴展,即 lambda 表達式和擴展方法,此代碼可重新編寫為如下所示:

IEnumerable locals = customers.Where(c => c.ZipCode == 91822).Select(c => c.Name);

請注意,此查詢的返回類型不同,它是 IEnumerable 而不是 IEnumerable。這是因為我們僅從 select 語句中返回客戶名稱。

當投影只是單一字段時,該方法確實很有效。但是,假設我們不僅要返回客戶的名稱,還要返回客戶的地址。理想的語法則應如下所示:

locals = customers.where(ZipCode == 98112).select(Name, Address);

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