Linq中带有迭代索引的Select扩展方法,为啥知道的人不多呢?
程序员文章站
2022-10-03 23:50:46
一:背景 昨天在看C 函数式编程这本书的时候,有一处让我干着急,需求是这样: 给多行文字加上数字列表项。 针对这个需求你会如何快捷高效的给每个项目加上数字编号呢? 我看书中是这样实现的,如下代码 怎么说呢,需求能实现没有问题,但这里还是累赘了,因使用到了拉链函数Zip 和生成范围的Range,全纠缠 ......
一:背景
昨天在看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的绝妙方法,这么