如何使用LINQ來簡化編程_.Net教程
推薦:使用ExtJS GridPanel從Web Service 獲取、綁定和顯示數(shù)據(jù)本文將向大家介紹一種使用 ExtJS 的 GridPanel 組件從 ASP.NET Web Service 獲取 XML 數(shù)據(jù)并進(jìn)行綁定和顯示的方法。 GridPanel 組件在進(jìn)行數(shù)據(jù)綁定時可以接收多種數(shù)據(jù)格式。其中以 JSON 和 XM
自從學(xué)習(xí)LINQ以來,我發(fā)現(xiàn)了很多使用LINQ來改善代碼的方式。每一個技巧都讓代碼寫起來更簡單,可讀性更強(qiáng)。
這里總結(jié)了這些技巧。我會介紹如何使用LINQ來:
◆初始化數(shù)組
◆在一個循環(huán)中遍歷多個數(shù)組
◆生成隨機(jī)序列
◆生成字符串
◆轉(zhuǎn)換序列或集合
◆把值轉(zhuǎn)換為長度為1的序列
◆遍歷序列的所有子集
如果你在LINQ方面有心得也歡迎在評論中一起分享。
1. 初始化數(shù)組
通常,我們需要把數(shù)組的值初始化為相同的值或遞增的序列值,或者可能是一個步進(jìn)不為1的遞增/遞減序列。有了LINQ,我們可以在數(shù)組的初始化器中完成所有工作,不再需要循環(huán)
在如下的示例代碼中,第一行代碼初始化了一個長度為10的數(shù)組,所有元素都是-1,第二行代碼初始化b為0、1、2到9,第三行代碼初始化c為100、110、120到190。
以下為引用的內(nèi)容:
int[] a = Enumerable.Repeat(-1, 10).ToArray(); int[] b = Enumerable.Range(0, 10).ToArray(); int[] c = Enumerable.Range(0, 10).Select(i => 100 10 * i).ToArray(); |
要提醒一下:如果你初始化一個很大的數(shù)組,最好不考慮這種優(yōu)雅的方式而是使用傳統(tǒng)的方式來替代。LINQ的這種解決方案會動態(tài)產(chǎn)生數(shù)組,因此垃圾數(shù)組需要在運(yùn)行時被回收。也就是說,我總是會在小數(shù)組或測試調(diào)試代碼的情況下使用這種技巧。
2. 在一個循環(huán)中遍歷多個數(shù)組
有個朋友問我一個C#的問題:有沒有辦法在一個循環(huán)中遍歷多個集合?他的代碼差不多是這樣:
以下為引用的內(nèi)容:
foreach (var x in array1) { DoSomething(x); } foreach (var x in array2) { DoSomething(x); } |
這樣的話,循環(huán)主體會很大,而且他也不希望這樣重復(fù)的代碼。但是,他又不希望創(chuàng)建一個數(shù)組來保存array1和array2的所有元素。
LINQ提供了一種優(yōu)雅的解決方案:Concat操作。我們可以使用單個循環(huán)來重寫上面的代碼,如下:
以下為引用的內(nèi)容:
foreach (var x in array1.Concat(array2)) { DoSomething(x); } |
注意,由于LINQ在枚舉器級別進(jìn)行操作,他不會產(chǎn)生新的數(shù)組來保存array1和array2的元素。因此,除了優(yōu)雅之外,這個方案還很高效。
3. 生成隨機(jī)序列
這是一個生成N長度隨機(jī)序列的簡單技巧:
以下為引用的內(nèi)容:
Random rand = new Random(); var randomSeq = Enumerable.Repeat(0, N).Select(i => rand.Next()); |
有了LINQ的延遲特性,序列不會實(shí)現(xiàn)進(jìn)行計(jì)算并保存到數(shù)組中,而是在迭代randomSeq的時候按需生成隨機(jī)數(shù)。
LINQ同樣也是生成各種類型字符串的好工具。對于測試或調(diào)試,生成字符串時很有用的。假設(shè)我們需要生成一個N長度的字符串,按照“ABCABCABC”的方式。使用LINQ,解決方案非常優(yōu)雅:
以下為引用的內(nèi)容:
string str = new string( Enumerable.Range(0, N) .Select(i => (char)(‘A’ i % 3)) .ToArray()); |
4.Petar Petrov給出了另外一種有趣的方式使用LINQ來生成字符串:
以下為引用的內(nèi)容:
string values = string.Join(string.Empty, Enumerable.Repeat(pattern, N).ToArray()); |
5. 轉(zhuǎn)換序列或集合
在C#或VB中我們不能實(shí)現(xiàn)把序列從T類型轉(zhuǎn)換為U類型,即使T從U類繼承。因此,即使把List轉(zhuǎn)換為List轉(zhuǎn)換為IEnumerable的話,LINQ有一個簡單而有效的解決方案:
以下為引用的內(nèi)容:
IEnumerablestrEnumerable = …; IEnumerable |
如果我們需要轉(zhuǎn)換List為List,LINQ也提供了解決方案,但是它會進(jìn)行列表的復(fù)制:
以下為引用的內(nèi)容:
ListstrList = …; List(strList.Cast()); |
Chris Cavanagh建議另外一種解決方式:
以下為引用的內(nèi)容:
var objList = strList.Cast().ToList(); |
6. 把值轉(zhuǎn)換為長度為1的序列
當(dāng)我們需要把單個值轉(zhuǎn)化為一個長度為1的序列時,會怎么做?我們可以創(chuàng)建一個長度為1的數(shù)組,但是我還是喜歡LINQ的Repeat操作:
以下為引用的內(nèi)容:
IEnumerableseq = Enumerable.Repeat(myValue, 1); |
7. 遍歷序列的所有子集
有的時候,遍歷數(shù)組的所有子集很有用。子集和問題、布爾可滿足性問題以及背包問題都可以通過遍歷某個序列的所有子集來簡單解決。
有了LINQ,我們可以如下聲場所有arr數(shù)組的子集:
以下為引用的內(nèi)容:
T[] arr = ...; var subsets = from m in Enumerable.Range(0, 1 <<arr.Length) select from i in Enumerable.Range(0, arr.Length) where (m &(1 <<i)) != 0 select arr[i]; |
注意,如果子集的個數(shù)超過了int,上面的代碼就不能工作。因此,僅當(dāng)你知道arr的長度不超過30的時候才去使用這個方式。如果arr長度超過30,你應(yīng)該不會是想去遍歷所有的子集,因?yàn)榭赡苓@會耗費(fèi)幾分鐘或更長的時間。
評論和總結(jié)
希望這些技巧對你有用,這些示例代碼都使用C#實(shí)現(xiàn),但是你可以很容易得改變?yōu)槠渌?NET語言。然而,LINQ對于支持?jǐn)U展方法、lambda表達(dá)式和類型推斷的語言更方便,比如C#和VB。這里的每一段代碼都可行,但是我不能保證什么,請?jiān)谑褂们白屑?xì)檢查。
LINQ,語言級集成查詢(Language INtegrated Query)LINQ 提供了一條更常規(guī)的途徑即給 .Net Framework 添加一些可以應(yīng)用于所有信息源( all sources of informa-tion )的具有多種用途( general-purpose )的語法查詢特性( query facilities ),這是比向開發(fā)語言和運(yùn)行時( runtime )添加一些關(guān)系數(shù)據(jù)( relational )特性或者類似 XML 特性( XML-specific )更好的方式。這些語法特性就叫做 .NET Language Integrated Query (LINQ) 。
分享:用Xaml做網(wǎng)頁框架下面就開始編寫XAML,首先來定義一下頁面的屬性: 以下為引用的內(nèi)容: <Page xmlns="http://schemas.microsoft
- asp.net如何得到GRIDVIEW中某行某列值的方法
- .net SMTP發(fā)送Email實(shí)例(可帶附件)
- js實(shí)現(xiàn)廣告漂浮效果的小例子
- asp.net Repeater 數(shù)據(jù)綁定的具體實(shí)現(xiàn)
- Asp.Net 無刷新文件上傳并顯示進(jìn)度條的實(shí)現(xiàn)方法及思路
- Asp.net獲取客戶端IP常見代碼存在的偽造IP問題探討
- VS2010 水晶報表的使用方法
- ASP.NET中操作SQL數(shù)據(jù)庫(連接字符串的配置及獲取)
- asp.net頁面?zhèn)髦禍y試實(shí)例代碼
- DataGridView - DataGridViewCheckBoxCell的使用介紹
- asp.net中javascript的引用(直接引入和間接引入)
- 三層+存儲過程實(shí)現(xiàn)分頁示例代碼
.Net教程Rss訂閱編程教程搜索
.Net教程推薦
- 談?wù)凥tmlControl與WebControl的區(qū)別與用途
- Asp.net在ashx文件中處理Session問題解決方法
- ASP.Net中利用CSS實(shí)現(xiàn)多界面兩法
- ASP.NET--制作功能完善的安裝程序
- 怎樣實(shí)現(xiàn).net程序的進(jìn)程注入
- ASP.NET 2.0中CSS不正常的解決方法
- 解析ASP.NET頁面數(shù)據(jù)導(dǎo)出到Excel或Word
- ASP.NET站點(diǎn)RSS功能實(shí)現(xiàn)方法
- 淺析asp.net驗(yàn)證控件失效原因及解決方法
- .NET中應(yīng)用程序內(nèi)共享UdpClient聯(lián)機(jī)的實(shí)現(xiàn)方法
- 相關(guān)鏈接:
- 教程說明:
.Net教程-如何使用LINQ來簡化編程。