您好,登錄后才能下訂單哦!
本篇內容介紹了“LINQ組合查詢怎么簡化編程”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
1. 初始化數組
通常,我們需要把數組的值初始化為相同的值或遞增的序列值,或者可能是一個步進不為1的遞增/遞減序列。有了linq組合查詢,我們可以在數組的初始化器中完成所有工作,不再需要循環!
在如下的示例代碼中,***行代碼初始化了一個長度為10的數組,所有元素都是-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();
要提醒一下:如果你初始化一個很大的數組,***不考慮這種優雅的方式而是使用傳統的方式來替代。linq組合查詢的這種解決方案會動態產生數組,因此垃圾數組需要在運行時被回收。也就是說,我總是會在小數組或測試調試代碼的情況下使用這種技巧。
2. 在一個循環中遍歷多個數組
有個朋友問我一個C#的問題:有沒有辦法在一個循環中遍歷多個集合?他的代碼差不多是這樣:
foreach (var x in array1) { dosomething(x); } foreach (var x in array2) { dosomething(x); }
這樣的話,循環主體會很大,而且他也不希望這樣重復的代碼。但是,他又不希望創建一個數組來保存array1和array2的所有元素。
linq組合查詢提供了一種優雅的解決方案:concat操作。我們可以使用單個循環來重寫上面的代碼,如下:
foreach (var x in array1.concat(array2)) { dosomething(x); }
注意,由于linq組合查詢在枚舉器級別進行操作,他不會產生新的數組來保存array1和array2的元素。因此,除了優雅之外,這個方案還很高效。
3. 生成隨機序列
這是一個生成n長度隨機序列的簡單技巧:
random rand = new random(); var randomseq = enumerable.repeat(0, n).select(i => rand.next());
有了linq組合查詢的延遲特性,序列不會實現進行計算并保存到數組中,而是在迭代randomseq的時候按需生成隨機數。
4. 生成字符串
linq組合查詢同樣也是生成各種類型字符串的好工具。對于測試或調試,生成字符串時很有用的。假設我們需要生成一個n長度的字符串,按照“abcabcabc”的方式。使用linq組合查詢,解決方案非常優雅:
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. 轉換序列或集合
在c#或vb中我們不能實現把序列從t類型轉換為u類型,即使t從u類繼承。因此,即使把list轉換為list,如果我們需要轉換list為list,linq組合查詢也提供了解決方案,但是它會進行列表的復制:
list strlist = …; listobjlist = new list(strlist.cast());
chris cavanagh建議另外一種解決方式:
var objlist = strlist.cast().tolist();
6. 把值轉換為長度為1的序列
當我們需要把單個值轉化為一個長度為1的序列時,會怎么做?我們可以創建一個長度為1的數組,但是我還是喜歡linq組合查詢的repeat操作:
ienumerable seq = enumerable.repeat(myvalue, 1);
7. 遍歷序列的所有子集
有的時候,遍歷數組的所有子集很有用。子集和問題、布爾可滿足性問題以及背包問題都可以通過遍歷某個序列的所有子集來簡單解決。
有了linq組合查詢,我們可以如下聲場所有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];
注意,如果子集的個數超過了int,上面的代碼就不能工作。因此,僅當你知道arr的長度不超過30的時候才去使用這個方式。如果arr長度超過30,你應該不會是想去遍歷所有的子集,因為可能這會耗費幾分鐘或更長的時間。
“LINQ組合查詢怎么簡化編程”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。