久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

【翻譯】使用LINQ來簡(jiǎn)化編程的7個(gè)技巧

 miky 2008-05-25

【翻譯】使用LINQ來簡(jiǎn)化編程的7個(gè)技巧

原文地址:http:///archive/7-tricks-to-simplify-your-programs-with-linq/

 

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

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

  • 初始化數(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,,第二行代碼初始化b01,、29,,第三行代碼初始化c100110,、120190.

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ù)組來保存array1array2的所有元素,。

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

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

    DoSomething(x);

}

注意,,由于LINQ在枚舉器級(jí)別進(jìn)行操作,,他不會(huì)產(chǎn)生新的數(shù)組來保存array1array2的元素。因此,,除了優(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’ + 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類型,,即使TU類繼承,。因此,即使把List<string>轉(zhuǎn)換為List<object>也很難實(shí)現(xiàn)。(要解釋為什么,,請(qǐng)看Bick Byer帖子),。但是如果要把IEnumerable<T>轉(zhuǎn)換為IEnumerable<U>的話,LINQ有一個(gè)簡(jiǎn)單而有效的解決方案:

IEnumerable<string> strEnumerable = …;

IEnumerable<object> objEnumerable = strEnumerable.Cast<object>();

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

List<string> strList = …;

List<object> objList = new List<object>(strList.Cast<object>());

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

var objList = strList.Cast<object>().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ù)組,但是我還是喜歡LINQRepeat操作:

IEnumerable<int> 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í)間,。

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

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

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點(diǎn),。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多