成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

技巧:LINQ組合查詢如何簡化編程

開發 后端
本文介紹了通過linq組合查詢來簡化代碼編寫的7個技巧,非常實用。

如何通過linq組合查詢來簡化代碼編寫?很多朋友可能都想過問題。下面,就給大家介紹一下我對于linq組合查詢的一些使用心得。

自從學習linq以來,我發現了很多使用linq組合查詢來改善代碼的方式。每一個技巧都讓代碼寫起來更簡單,可讀性更強。

這里總結了這些技巧。我會介紹如何使用linq組合查詢來:

◆初始化數組

◆在一個循環中遍歷多個數組

◆生成隨機序列

◆生成字符串

◆轉換序列或集合

◆把值轉換為長度為1的序列

◆遍歷序列的所有子集

如果你在linq組合查詢方面有心得也歡迎在評論中一起分享。

1. 初始化數組

通常,我們需要把數組的值初始化為相同的值或遞增的序列值,或者可能是一個步進不為1的遞增/遞減序列。有了linq組合查詢,我們可以在數組的初始化器中完成所有工作,不再需要循環!

在如下的示例代碼中,***行代碼初始化了一個長度為10的數組,所有元素都是-1,第二行代碼初始化b為0、1、2到9,第三行代碼初始化c為100、110、120到190。

  1. int[] a = enumerable.repeat(-1, 10).toarray();  
  2.  
  3. int[] b = enumerable.range(0, 10).toarray();  
  4.  
  5. int[] c = enumerable.range(0, 10).select(i => 100 + 10 * i).toarray(); 

要提醒一下:如果你初始化一個很大的數組,***不考慮這種優雅的方式而是使用傳統的方式來替代。linq組合查詢的這種解決方案會動態產生數組,因此垃圾數組需要在運行時被回收。也就是說,我總是會在小數組或測試調試代碼的情況下使用這種技巧。

2. 在一個循環中遍歷多個數組

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

  1. foreach (var x in array1) {  
  2.  
  3.     dosomething(x);  
  4. }   
  5.  
  6. foreach (var x in array2) {  
  7.  
  8.     dosomething(x);  

這樣的話,循環主體會很大,而且他也不希望這樣重復的代碼。但是,他又不希望創建一個數組來保存array1和array2的所有元素。

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

  1. foreach (var x in array1.concat(array2)) {  
  2.  
  3.     dosomething(x);  
  4.  

注意,由于linq組合查詢在枚舉器級別進行操作,他不會產生新的數組來保存array1和array2的元素。因此,除了優雅之外,這個方案還很高效。

3. 生成隨機序列

這是一個生成n長度隨機序列的簡單技巧:

  1. random rand = new random();  
  2.  
  3. var randomseq = enumerable.repeat(0, n).select(i => rand.next()); 

有了linq組合查詢的延遲特性,序列不會實現進行計算并保存到數組中,而是在迭代randomseq的時候按需生成隨機數。

4. 生成字符串

linq組合查詢同樣也是生成各種類型字符串的好工具。對于測試或調試,生成字符串時很有用的。假設我們需要生成一個n長度的字符串,按照“abcabcabc”的方式。使用linq組合查詢,解決方案非常優雅:

  1. string str = new string(  
  2.  
  3.     enumerable.range(0, n)  
  4.  
  5.     .select(i => (char)(‘a’ + i % 3))  
  6.  
  7.     .toarray()); 

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

  1. string values = string.join(string.empty,   
  2. enumerable.repeat(pattern, n).toarray()); 

#p#

5. 轉換序列或集合

在c#或vb中我們不能實現把序列從t類型轉換為u類型,即使t從u類繼承。因此,即使把list轉換為list,如果我們需要轉換list為list,linq組合查詢也提供了解決方案,但是它會進行列表的復制:

  1. list strlist = …;  
  2.  
  3. listobjlist = new list(strlist.cast()); 

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

  1. var objlist = strlist.cast().tolist();  

6. 把值轉換為長度為1的序列

當我們需要把單個值轉化為一個長度為1的序列時,會怎么做?我們可以創建一個長度為1的數組,但是我還是喜歡linq組合查詢的repeat操作:

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

7. 遍歷序列的所有子集

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

有了linq組合查詢,我們可以如下聲場所有arr數組的子集:

  1. t[] arr = ...;  
  2.  
  3. var subsets = from m in enumerable.range(0, 1 << arr.length)  
  4.  
  5.               select  
  6.  
  7.                   from i in enumerable.range(0, arr.length)  
  8.  
  9.                   where (m & (1 << i)) != 0  
  10.  
  11.                   select arr[i]; 

注意,如果子集的個數超過了int,上面的代碼就不能工作。因此,僅當你知道arr的長度不超過30的時候才去使用這個方式。如果arr長度超過30,你應該不會是想去遍歷所有的子集,因為可能這會耗費幾分鐘或更長的時間。

評論和總結

希望這些技巧對你有用,這些示例代碼都使用c#實現,但是你可以很容易得改變為其它.net語言。然而,linq組合查詢對于支持擴展方法、lambda表達式和類型推斷的語言更方便,比如c#和vb。這里的每一段代碼都可行,但是我不能保證什么,請在使用前仔細檢查。

【編輯推薦】

  1. LINQ查詢的目的與實現手段
  2. LINQ查詢表達式深入剖析
  3. 實例二:綁定到LINQ查詢的結果
  4. LINQ——語言級集成查詢入門指南
  5. LINQ的演變及其對C#設計的影響
責任編輯:林琳 來源: gzu521.com
相關推薦

2009-09-07 21:25:59

Linq自定義

2009-09-07 22:54:03

Linq組合查詢

2009-09-07 20:40:48

LINQ子查詢

2009-09-17 09:45:36

LINQ查詢語句

2010-05-17 09:34:46

LINQAjax

2012-04-13 10:00:04

LINQ

2009-09-15 17:45:34

Linq多條件

2009-09-15 10:46:04

LINQ to SQL

2009-09-16 10:38:43

LINQ查詢

2009-09-17 13:15:20

LINQ查詢

2009-09-16 10:08:06

LINQ查詢

2013-12-10 09:13:19

FreneticPyreticOpenFlow

2009-09-09 16:53:53

LINQ查詢語法

2009-09-10 16:28:17

LINQ查詢

2009-09-14 10:09:26

LINQ查詢結果

2009-09-14 10:13:02

LINQ查詢操作

2009-09-08 17:27:18

LINQ to Dat

2021-12-07 11:31:47

Python代碼if…elif…els

2009-09-07 17:05:10

LINQ進行查詢

2009-09-08 09:24:50

LINQ查詢
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产激情偷乱视频一区二区三区 | 欧洲高清转码区一二区 | 国产999精品久久久久久 | 欧美一级久久 | 人人干人人草 | 91视频免费观看 | 久久亚洲一区二区三区四区 | 老牛嫩草一区二区三区av | 欧美视频免费在线 | 亚洲福利网 | 久久久精彩视频 | 日韩中文一区二区 | 国产精品高潮呻吟久久 | 日韩精品免费视频 | 精品一区二区电影 | 伊人性伊人情综合网 | 国产精品1区2区 | 精品91久久久 | 精品国产欧美一区二区三区不卡 | 国产精品成人一区 | www一级片 | 99国内精品久久久久久久 | 久久欧美高清二区三区 | 久久国产精品-国产精品 | 男女一区二区三区 | 日韩精品成人av | 国产精品久久网 | 欧美日韩一区在线 | 午夜久久久| 欧美一区二区在线观看 | 鸳鸯谱在线观看高清 | 国产成人免费视频网站视频社区 | 一区二视频 | 99热.com| 五月婷婷激情网 | 国产传媒视频在线观看 | av免费成人 | a级片网站| 国产成人jvid在线播放 | 免费在线观看一区二区 | 国内精品视频在线观看 |