欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
【翻譯】使用LINQ來(lái)簡(jiǎn)化編程的7個(gè)技巧

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

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

 

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

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

  • 初始化數組
  • 在一個(gè)循環(huán)中遍歷多個(gè)數組
  • 生成隨機序列
  • 生成字符串
  • 轉換序列或集合
  • 把值轉換為長(cháng)度為1的序列
  • 遍歷序列的所有子集

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

1. 初始化數組

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

在如下的示例代碼中,第一行代碼初始化了一個(gè)長(cháng)度為10的數組,所有元素都是-1,第二行代碼初始化b0、1、29,第三行代碼初始化c100、110、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è)很大的數組,最好不考慮這種優(yōu)雅的方式而是使用傳統的方式來(lái)替代。LINQ的這種解決方案會(huì )動(dòng)態(tài)產(chǎn)生數組,因此垃圾數組需要在運行時(shí)被回收。也就是說(shuō),我總是會(huì )在小數組或測試調試代碼的情況下使用這種技巧。

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

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

foreach (var x in array1) {

    DoSomething(x);

}

 

foreach (var x in array2) {

    DoSomething(x);

}

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

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

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

    DoSomething(x);

}

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

3. 生成隨機序列

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

Random rand = new Random();

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

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

4. 生成字符串

    LINQ同樣也是生成各種類(lèi)型字符串的好工具。對于測試或調試,生成字符串時(shí)很有用的。假設我們需要生成一個(gè)N長(cháng)度的字符串,按照“ABCABCABC”的方式。使用LINQ,解決方案非常優(yōu)雅:

string str = new string(

    Enumerable.Range(0, N)

    .Select(i => (char)(‘A’ + i % 3))

    .ToArray());

    Petar Petrov給出了另外一種有趣的方式使用LINQ來(lái)生成字符串:

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

5. 轉換序列或集合

    C#VB中我們不能實(shí)現把序列從T類(lèi)型轉換為U類(lèi)型,即使TU類(lèi)繼承。因此,即使把List<string>轉換為List<object>也很難實(shí)現。(要解釋為什么,請看Bick Byer帖子)。但是如果要把IEnumerable<T>轉換為IEnumerable<U>的話(huà),LINQ有一個(gè)簡(jiǎn)單而有效的解決方案:

IEnumerable<string> strEnumerable = …;

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

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

List<string> strList = …;

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

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

var objList = strList.Cast<object>().ToList();

6. 把值轉換為長(cháng)度為1的序列

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

IEnumerable<int> seq = Enumerable.Repeat(myValue, 1);

7. 遍歷序列的所有子集

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

    有了LINQ,我們可以如下聲場(chǎng)所有arr數組的子集:

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è)數超過(guò)了int,上面的代碼就不能工作。因此,僅當你知道arr的長(cháng)度不超過(guò)30的時(shí)候才去使用這個(gè)方式。如果arr長(cháng)度超過(guò)30,你應該不會(huì )是想去遍歷所有的子集,因為可能這會(huì )耗費幾分鐘或更長(cháng)的時(shí)間。

評論和總結

    希望這些技巧對你有用,這些示例代碼都使用C#實(shí)現,但是你可以很容易得改變?yōu)槠渌?span lang="EN-US">.NET語(yǔ)言。然而,LINQ對于支持擴展方法、lambda表達式和類(lèi)型推斷的語(yǔ)言更方便,比如C#VB。這里的每一段代碼都可行,但是我不能保證什么,請在使用前仔細檢查。

本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
JS遍歷對象的七種方法
算法所有常見(jiàn)知識點(diǎn)總結
IEnumerable和IEnumerable<T>接口
Linq 語(yǔ)句學(xué)習1
JavaScript權威指南 第11章 樣章
深入淺出數據結構
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久