LINQ序列詳細(xì)描述
學(xué)習(xí)LINQ時(shí),經(jīng)常會(huì)遇到LINQ序列問(wèn)題,這里將介紹LINQ序列問(wèn)題的解決方法。
自從學(xué)習(xí)LINQ以來(lái),我發(fā)現(xiàn)了很多使用LINQ來(lái)改善代碼的方式。每一個(gè)技巧都讓代碼寫起來(lái)更簡(jiǎn)單,可讀性更強(qiáng)。
這里總結(jié)了這些技巧。我會(huì)介紹如何使用LINQ來(lái):
◆初始化數(shù)組
◆在一個(gè)循環(huán)中遍歷多個(gè)數(shù)組
◆生成隨機(jī)序列
◆生成字符串
◆轉(zhuǎn)換序列或集合
◆把值轉(zhuǎn)換為長(zhǎng)度為1的序列
◆遍歷LINQ序列的所有子集
本文介紹遍歷LINQ序列的所有子集,如果你在LINQ方面有心得也歡迎在評(píng)論中一起分享。
遍歷LINQ序列的所有子集
有的時(shí)候,遍歷數(shù)組的所有子集很有用。子集和問(wèn)題、布爾可滿足性問(wèn)題以及背包問(wèn)題都可以通過(guò)遍歷某個(gè)序列的所有子集來(lái)簡(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ù)超過(guò)了int,上面的代碼就不能工作。因此,僅當(dāng)你知道arr的長(zhǎng)度不超過(guò)30的時(shí)候才去使用這個(gè)方式。如果arr長(zhǎng)度超過(guò)30,你應(yīng)該不會(huì)是想去遍歷所有的子集,因?yàn)榭赡苓@會(huì)耗費(fèi)幾分鐘或更長(zhǎng)的時(shí)間。
希望這些技巧對(duì)你有用,這些示例代碼都使用C#實(shí)現(xiàn),但是你可以很容易得改變?yōu)槠渌?NET語(yǔ)言。
【編輯推薦】