.net與其他技術棧的不同之處之一絕對是linq,它是language integrated query的首字母縮寫。實際上,它是隨.net framework 3.5和visual studio 2008引入的,它是第乙個獨立於體系結構並整合在c#和visual basic語言中的框架。
借助linq,我們可以使用獨立於各種源的單個程式設計模型來查詢和運算元據。為了更好地理解它是什麼,我們必須一步步的看下他的發展歷程。
在c#的第乙個版本中,我們必須使用for或foreach迴圈來遍歷乙個集合,正如我們所知,該集合實現ienumerable介面,例如,在其中找到乙個特定的物件。以下**返回公司年齡在19至36歲(20至35歲)之間的所有客戶:
class customer
public string customername
public int age
} class program
, new customer() ,
new customer() ,
};customer customers = new customer[10];
int i = 0;
foreach (customer cst in customerarray)
} }
}
有什麼不同的方法?讓我們嘗試從「委託」的概念開始逐步進行開發。delegate和返回的型別的方法的引用型別。它「委託」它旨在執行**的方法,我們可以用這種方式宣告它:
public delegate bool operations(int number);
此委託可以指向所有接受輸入整數並返回布林值的方法。例如,假設在customeroperations類中有乙個方法:
public bool customeragerangecheck(int number)
我們可以註冊乙個或多個將在執行委託時執行的方法:
operations op = new operations(customeroperations.customeragerangecheck);
或者簡單地:
operations op = customeroperations.customeragerangecheck;
因此,我們可以使用委託,在這種情況下,它將返回true:
op(22);
委託用於將方法作為引數傳遞給其他方法:事件處理程式和**是通過委託呼叫的方法的示例。
c#2.0引入了匿名委託,您現在可以使用匿名方法來宣告和初始化委託。例如,我們可以這樣寫:
delegate bool customerfilters(customer customer);
class customeroperations
return result;
}}class program
, new customer() ,
new customer() ,
};customer filteredcustomersage = customeroperations.findwhere(customers, delegate (customer customer) //using anonimous delegate);}
}
使用c#2.0,我們的優勢是可以使用匿名委託在不同條件下進行搜尋,而無需使用for或foreach迴圈。例如,我們可以使用上乙個示例中相同的委託函式來查詢「 customerid」為3或名稱為「 bob」的客戶:
customer filteredcustomersid = customeroperations.findwhere(customers, delegate (customer customer)
);customer filteredcustomersname = customeroperations.findwhere(customers, delegate (customer customer)
);
隨著c#的發展,從3.x版本開始,microsoft團隊引入了新功能,使**更加緊湊和易讀。這些直接支援linq來查詢不同型別的資料來源並獲得產生單個指令的元素。
這些功能是:
var customerage = 30; // implicitly typed.
int customerage = 30; // explicitly typed.
customer customer = new customer ;
與以下**不同,在前一種情況下,所有內容都被視為單個操作。
customer customer = new customer();
customer.age = 30;
customer.customername = "adolfo";
匿名型別,由編譯器構建的唯讀型別,只有編譯器知道它。但是,如果程式集中的兩個或多個匿名物件初始化程式具有相同順序的屬性序列,並且具有相同的名稱和型別,則編譯器會將這些物件視為相同型別的例項。
匿名型別是將查詢結果中的一組屬性臨時分組的好方法,而不必定義單獨的命名型別。
var customer = new ;
public static class stringextensionmethods
}
console.writeline("hello".reversestring()); //olleh
請注意,在方法呼叫中不得指定第乙個引數,該引數以this修飾符開頭。
lambda表示式,可作為可變的或作為在一方法呼叫中的引數被傳遞匿名函式。
customer => customer.age > 19 && customer.age < 36;
=>
運算子稱為lambda運算子,而customer
是函式的輸入引數。lambda運算子右側的部分代表函式的主體及其返回的值,在這種情況下為布林值。
在linq的引入中,我們終於有了c#3.5版本。
簡而言之,我們可以說linq是ienumerable
和iqueryable
介面的擴充套件方法庫,它使我們能夠執行各種操作,如過濾,進行投影,聚合和排序。
我們有幾種可用的linq實現:
在前面的示例中,陣列用作資料來源,因此隱式支援通用介面ienumerable
。支援ienumerable
或其派生介面的型別(例如通用iqueryable 介面)稱為可查詢型別,使我們可以直接執行linq查詢。如果資料來源尚未以可查詢型別儲存在記憶體中,則linq提供程式必須將其表示為可查詢型別。
正如我們所說,linq查詢主要基於.net framework 2.0版中引入的通用型別。這意味著,例如,如果嘗試將customer物件新增到list物件,則在編譯時將生成錯誤。使用通用集合很容易,因為不需要在執行時強制轉換型別。
如果願意,可以使用前面提到的var關鍵字來避免通用語法,在下面的示例中,該關鍵字要求編譯器通過檢查from子句中指定的資料來源來推斷查詢變數的型別。
因此,讓我們看看如何能達到同樣的效果,在前面的**中我們獲得了使用匿名委託,使用linq到物件查詢,該變種構造和lambda表示式:
var filteredcustomersage = customers.where(c => c.age > 19 && c.age < 36);
var filteredcustomersage =
from customer in customers
where customer.age > 19 && customer.age < 36
select customer;
**: 時統ptp 時統系統(時統裝置)詳細資料和介紹分享
輸入模組 l gps 輸入 接收 gps l1,c a 碼訊號 1575.42mhz,16 通道 授時精度優於 30ns rms 定位精度優於 3m rms 冷啟動 29s 熱啟動 1s l 北斗輸入 接收北斗二 b1 訊號,1561.098mhz,16 通道授時精度優於 30ns rms 定位精度...
LINQ聖經 《LINQ實戰》
本書作者是 linq 社群中的重要成員,他們在書中展示了這一技術的精髓 快去享受這一盛宴吧。matt warren 微軟主架構師,linq 之父 linq 方面的傑作!深入 全面 客觀,令人欲罷不能。強烈推薦!patrick smacchia 微軟 mvp c 和 net 2.0 實戰 作者 微軟 ...
LINQ教程一 LINQ簡介
一 為什麼要使用linq 要理解為什麼使用linq,先來看下面乙個例子。假設有乙個整數型別的陣列,找到裡面的偶數並進行降序排序。1 using system 2using system.collections.generic 3using system.linq 4using system.text...