真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

LINQ組合查詢?cè)趺春?jiǎn)化編程

本篇內(nèi)容介紹了“LINQ組合查詢?cè)趺春?jiǎn)化編程”的有關(guān)知識(shí),在實(shí)際案例的操作過程中,不少人都會(huì)遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

創(chuàng)新互聯(lián)網(wǎng)站建設(shè)公司,提供網(wǎng)站設(shè)計(jì)、成都網(wǎng)站設(shè)計(jì),網(wǎng)頁(yè)設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);可快速的進(jìn)行網(wǎng)站開發(fā)網(wǎng)頁(yè)制作和功能擴(kuò)展;專業(yè)做搜索引擎喜愛的網(wǎng)站,是專業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來合作!

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。

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)的方式來替代。linq組合查詢的這種解決方案會(huì)動(dòng)態(tài)產(chǎn)生數(shù)組,因此垃圾數(shù)組需要在運(yùn)行時(shí)被回收。也就是說,我總是會(huì)在小數(shù)組或測(cè)試調(diào)試代碼的情況下使用這種技巧。

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

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

foreach (var x in array1) {       dosomething(x);  }    foreach (var x in array2) {       dosomething(x);  }

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

linq組合查詢提供了一種優(yōu)雅的解決方案:concat操作。我們可以使用單個(gè)循環(huán)來重寫上面的代碼,如下:

foreach (var x in array1.concat(array2)) {       dosomething(x);   }

注意,由于linq組合查詢?cè)诿杜e器級(jí)別進(jìn)行操作,他不會(huì)產(chǎn)生新的數(shù)組來保存array1和array2的元素。因此,除了優(yōu)雅之外,這個(gè)方案還很高效。

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

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

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ù)。

4. 生成字符串

linq組合查詢同樣也是生成各種類型字符串的好工具。對(duì)于測(cè)試或調(diào)試,生成字符串時(shí)很有用的。假設(shè)我們需要生成一個(gè)n長(zhǎng)度的字符串,按照“abcabcabc”的方式。使用linq組合查詢,解決方案非常優(yōu)雅:

string str = new string(       enumerable.range(0, n)       .select(i => (char)(‘a(chǎn)’ + i % 3))       .toarray());

petar petrov給出了另外一種有趣的方式使用linq組合查詢來生成字符串:

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)換list為list,linq組合查詢也提供了解決方案,但是它會(huì)進(jìn)行列表的復(fù)制:

list strlist = …;   listobjlist = new list(strlist.cast());

chris cavanagh建議另外一種解決方式:

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操作:

ienumerable seq = enumerable.repeat(myvalue, 1);

7. 遍歷序列的所有子集

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

有了linq組合查詢,我們可以如下聲場(chǎng)所有arr數(shù)組的子集:

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

“LINQ組合查詢?cè)趺春?jiǎn)化編程”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!


當(dāng)前名稱:LINQ組合查詢?cè)趺春?jiǎn)化編程
標(biāo)題網(wǎng)址:http://weahome.cn/article/ppposi.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部