日韩天天综合网_野战两个奶头被亲到高潮_亚洲日韩欧美精品综合_av女人天堂污污污_视频一区**字幕无弹窗_国产亚洲欧美小视频_国内性爱精品在线免费视频_国产一级电影在线播放_日韩欧美内地福利_亚洲一二三不卡片区

如何使用LINQ來(lái)簡(jiǎn)化編程_.Net教程

編輯Tag賺U幣
教程Tag:暫無(wú)Tag,歡迎添加,賺取U幣!

推薦:使用ExtJS GridPanel從Web Service 獲取、綁定和顯示數(shù)據(jù)
本文將向大家介紹一種使用 ExtJS 的 GridPanel 組件從 ASP.NET Web Service 獲取 XML 數(shù)據(jù)并進(jìn)行綁定和顯示的方法。 GridPanel 組件在進(jìn)行數(shù)據(jù)綁定時(shí)可以接收多種數(shù)據(jù)格式。其中以 JSON 和 XM

自從學(xué)習(xí)LINQ以來(lái),我發(fā)現(xiàn)了很多使用LINQ來(lái)改善代碼的方式。每一個(gè)技巧都讓代碼寫(xiě)起來(lái)更簡(jiǎn)單,可讀性更強(qiáng)。

這里總結(jié)了這些技巧。我會(huì)介紹如何使用LINQ來(lái):

◆初始化數(shù)組

◆在一個(gè)循環(huán)中遍歷多個(gè)數(shù)組

◆生成隨機(jī)序列

◆生成字符串

◆轉(zhuǎn)換序列或集合

◆把值轉(zhuǎn)換為長(zhǎng)度為1的序列

◆遍歷序列的所有子集

如果你在LINQ方面有心得也歡迎在評(píng)論中一起分享。

1. 初始化數(shù)組

通常,我們需要把數(shù)組的值初始化為相同的值或遞增的序列值,或者可能是一個(gè)步進(jìn)不為1的遞增/遞減序列。有了LINQ,我們可以在數(shù)組的初始化器中完成所有工作,不再需要循環(huán)

在如下的示例代碼中,第一行代碼初始化了一個(gè)長(zhǎng)度為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();

要提醒一下:如果你初始化一個(gè)很大的數(shù)組,最好不考慮這種優(yōu)雅的方式而是使用傳統(tǒng)的方式來(lái)替代。LINQ的這種解決方案會(huì)動(dòng)態(tài)產(chǎn)生數(shù)組,因此垃圾數(shù)組需要在運(yùn)行時(shí)被回收。也就是說(shuō),我總是會(huì)在小數(shù)組或測(cè)試調(diào)試代碼的情況下使用這種技巧。

2. 在一個(gè)循環(huán)中遍歷多個(gè)數(shù)組

有個(gè)朋友問(wèn)我一個(gè)C#的問(wèn)題:有沒(méi)有辦法在一個(gè)循環(huán)中遍歷多個(gè)集合?他的代碼差不多是這樣:

以下為引用的內(nèi)容:

  foreach (var x in array1) {

  DoSomething(x);

  }

  foreach (var x in array2) {

  DoSomething(x);

  }

這樣的話(huà),循環(huán)主體會(huì)很大,而且他也不希望這樣重復(fù)的代碼。但是,他又不希望創(chuàng)建一個(gè)數(shù)組來(lái)保存array1和array2的所有元素。

LINQ提供了一種優(yōu)雅的解決方案:Concat操作。我們可以使用單個(gè)循環(huán)來(lái)重寫(xiě)上面的代碼,如下:

以下為引用的內(nèi)容:

  foreach (var x in array1.Concat(array2)) {

  DoSomething(x);

  }

注意,由于LINQ在枚舉器級(jí)別進(jìn)行操作,他不會(huì)產(chǎn)生新的數(shù)組來(lái)保存array1和array2的元素。因此,除了優(yōu)雅之外,這個(gè)方案還很高效。

3. 生成隨機(jī)序列

這是一個(gè)生成N長(zhǎng)度隨機(jī)序列的簡(jiǎn)單技巧:

以下為引用的內(nèi)容:

  Random rand = new Random();

  var randomSeq = Enumerable.Repeat(0, N).Select(i => rand.Next());

有了LINQ的延遲特性,序列不會(huì)實(shí)現(xiàn)進(jìn)行計(jì)算并保存到數(shù)組中,而是在迭代randomSeq的時(shí)候按需生成隨機(jī)數(shù)。

LINQ同樣也是生成各種類(lèi)型字符串的好工具。對(duì)于測(cè)試或調(diào)試,生成字符串時(shí)很有用的。假設(shè)我們需要生成一個(gè)N長(zhǎng)度的字符串,按照“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來(lái)生成字符串:

以下為引用的內(nèi)容:

  string values = string.Join(string.Empty, Enumerable.Repeat(pattern, N).ToArray());

 

5. 轉(zhuǎn)換序列或集合

在C#或VB中我們不能實(shí)現(xiàn)把序列從T類(lèi)型轉(zhuǎn)換為U類(lèi)型,即使T從U類(lèi)繼承。因此,即使把List轉(zhuǎn)換為L(zhǎng)ist轉(zhuǎn)換為IEnumerable的話(huà),LINQ有一個(gè)簡(jiǎn)單而有效的解決方案:

以下為引用的內(nèi)容:

  IEnumerablestrEnumerable = …;

  IEnumerable

如果我們需要轉(zhuǎn)換List為L(zhǎng)ist,LINQ也提供了解決方案,但是它會(huì)進(jìn)行列表的復(fù)制:

以下為引用的內(nèi)容:

  ListstrList = …;

  List(strList.Cast());

Chris Cavanagh建議另外一種解決方式:

以下為引用的內(nèi)容:

  var objList = strList.Cast().ToList();

6. 把值轉(zhuǎn)換為長(zhǎng)度為1的序列

當(dāng)我們需要把單個(gè)值轉(zhuǎn)化為一個(gè)長(zhǎng)度為1的序列時(shí),會(huì)怎么做?我們可以創(chuàng)建一個(gè)長(zhǎng)度為1的數(shù)組,但是我還是喜歡LINQ的Repeat操作:

以下為引用的內(nèi)容:

  IEnumerableseq = Enumerable.Repeat(myValue, 1);

7. 遍歷序列的所有子集

有的時(shí)候,遍歷數(shù)組的所有子集很有用。子集和問(wèn)題、布爾可滿(mǎn)足性問(wèn)題以及背包問(wèn)題都可以通過(guò)遍歷某個(gè)序列的所有子集來(lái)簡(jiǎn)單解決。

有了LINQ,我們可以如下聲場(chǎng)所有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];

注意,如果子集的個(gè)數(shù)超過(guò)了int,上面的代碼就不能工作。因此,僅當(dāng)你知道arr的長(zhǎng)度不超過(guò)30的時(shí)候才去使用這個(gè)方式。如果arr長(zhǎng)度超過(guò)30,你應(yīng)該不會(huì)是想去遍歷所有的子集,因?yàn)榭赡苓@會(huì)耗費(fèi)幾分鐘或更長(zhǎng)的時(shí)間。

評(píng)論和總結(jié)

希望這些技巧對(duì)你有用,這些示例代碼都使用C#實(shí)現(xiàn),但是你可以很容易得改變?yōu)槠渌?NET語(yǔ)言。然而,LINQ對(duì)于支持?jǐn)U展方法、lambda表達(dá)式和類(lèi)型推斷的語(yǔ)言更方便,比如C#和VB。這里的每一段代碼都可行,但是我不能保證什么,請(qǐng)?jiān)谑褂们白屑?xì)檢查。

LINQ,語(yǔ)言級(jí)集成查詢(xún)(Language INtegrated Query)LINQ 提供了一條更常規(guī)的途徑即給 .Net Framework 添加一些可以應(yīng)用于所有信息源( all sources of informa-tion )的具有多種用途( general-purpose )的語(yǔ)法查詢(xún)特性( query facilities ),這是比向開(kāi)發(fā)語(yǔ)言和運(yùn)行時(shí)( runtime )添加一些關(guān)系數(shù)據(jù)( relational )特性或者類(lèi)似 XML 特性( XML-specific )更好的方式。這些語(yǔ)法特性就叫做 .NET Language Integrated Query (LINQ) 。

分享:用Xaml做網(wǎng)頁(yè)框架
下面就開(kāi)始編寫(xiě)XAML,首先來(lái)定義一下頁(yè)面的屬性: 以下為引用的內(nèi)容: <Page xmlns="http://schemas.microsoft

來(lái)源:模板無(wú)憂(yōu)//所屬分類(lèi):.Net教程/更新時(shí)間:2009-09-17
相關(guān).Net教程