Linq中帶有迭代索引的Select擴充套件方法,為啥知道的人不多呢?
阿新 • • 發佈:2020-04-17
一:背景
昨天在看C#函數語言程式設計這本書的時候,有一處讓我乾著急,需求是這樣: 給多行文字加上數字列表項。
針對這個需求你會如何快捷高效的給每個專案加上數字編號呢? 我看書中是這樣實現的,如下程式碼
public class Program { public static void Main(string[] args) { var list = new List<string>() { "cnblogs","csdn","zhihu","oschina" }; var items = list.Zip(Enumerable.Range(1, list.Count + 1), (item, i) => $"{i}. {item}").ToList(); items.ForEach(Console.WriteLine); } } ------------------- output ------------------- 1. cnblogs 2. csdn 3. zhihu 4. oschina Press any key to continue . . .
怎麼說呢,需求能實現沒有問題,但這裡還是累贅了,因使用到了拉鍊函式Zip 和生成範圍的Range,全糾纏到一塊,有沒有更簡單粗暴的方式呢? 其實你只用Select的一個帶迭代變數的過載方法就可以搞定,但現實中還是有很多的程式設計師不會使用或者說不知道,所以優化後的程式碼如下。
var items = list.Select((item, i) => $"{i + 1}. {item}").ToList(); ------------------- output ------------------- 1. cnblogs 2. csdn 3. zhihu 4. oschina Press any key to continue . . .
二:原始碼探究
相信編碼多年的我們無數次的在憎恨foreach沒有帶上索引,這麼普羅大眾的需求盡然都沒有實現,而python這樣的語言早就給實現了,為了解決這個不足,我還得需要單獨定義一個變數在迭代時即時記錄,煩不勝煩,就像下面這樣。
var index = 0;
foreach (var item in list)
{
index++;
Console.WriteLine(item);
}
可能FCL類庫程式設計師也深有體會,所以加了一個可以在迭代中獲取當前index的絕妙方法,這麼