自從學習LINQ以來我發現了很多使用LINQ來改善代碼的方式每一個技巧都讓代碼寫起來更簡單可讀性更強
這裡總結了這些技巧我會介紹如何使用LINQ來
◆初始化數組
◆在一個循環中遍歷多個數組
◆生成隨機序列
◆生成字符串
◆轉換序列或集合
◆把值轉換為長度為的序列
◆遍歷序列的所有子集
如果你在LINQ方面有心得也歡迎在評論中一起分享
初始化數組
通常我們需要把數組的值初始化為相同的值或遞增的序列值或者可能是一個步進不為的遞增/遞減序列有了LINQ我們可以在數組的初始化器中完成所有工作不再需要循環!
在如下的示例代碼中第一行代碼初始化了一個長度為的數組所有元素都是第二行代碼初始化b為到第三行代碼初始化c為到
int[] a = EnumerableRepeat( )ToArray();
int[] b = EnumerableRange( )ToArray();
int[] c = EnumerableRange( )Select(i => + * i)ToArray();
要提醒一下如果你初始化一個很大的數組最好不考慮這種優雅的方式而是使用傳統的方式來替代LINQ的這種解決方案會動態產生數組因此垃圾數組需要在運行時被回收也就是說我總是會在小數組或測試調試代碼的情況下使用這種技巧
在一個循環中遍歷多個數組
有個朋友問我一個C#的問題有沒有辦法在一個循環中遍歷多個集合?他的代碼差不多是這樣
foreach (var x in array) {
DoSomething(x);
}
foreach (var x in array) {
DoSomething(x);
}
這樣的話循環主體會很大而且他也不希望這樣重復的代碼但是他又不希望創建一個數組來保存array和array的所有元素
LINQ提供了一種優雅的解決方案Concat操作我們可以使用單個循環來重寫上面的代碼如下
foreach (var x in arrayConcat(array)) {
DoSomething(x);
}
注意由於LINQ在枚舉器級別進行操作他不會產生新的數組來保存array和array的元素因此除了優雅之外這個方案還很高效
生成隨機序列
這是一個生成N長度隨機序列的簡單技巧
Random rand = new Random();
var randomSeq = EnumerableRepeat( N)Select(i => randNext());
有了LINQ的延遲特性序列不會實現進行計算並保存到數組中而是在迭代randomSeq的時候按需生成隨機數
生成字符串
LINQ同樣也是生成各種類型字符串的好工具對於測試或調試生成字符串時很有用的假設我們需要生成一個N長度的字符串按照ABCABCABC的方式使用LINQ解決方案非常優雅
string str = new string(
EnumerableRange( N)
Select(i => (char)(A + i % ))
ToArray());
Petar Petrov給出了另外一種有趣的方式使用LINQ來生成字符串
string values = stringJoin(stringEmpty EnumerableRepeat(pattern N)ToArray());
轉換序列或集合
在C#或VB中我們不能實現把序列從T類型轉換為U類型即使T從U類繼承因此即使把List轉換為List
From:http://tw.wingwit.com/Article/program/net/201311/13140.html