Linq中带有迭代索引的Select扩展方法,为啥知道的人不多呢?

网友投稿 605 2022-09-22

Linq中带有迭代索引的Select扩展方法,为啥知道的人不多呢?

Linq中带有迭代索引的Select扩展方法,为啥知道的人不多呢?

一:背景

昨天在看C#函数式编程这本书的时候,有一处让我干着急,需求是这样: 给多行文字加上数字列表项。

针对这个需求你会如何快捷高效的给每个项目加上数字编号呢? 我看书中是这样实现的,如下代码

public class Program

{

public static void Main(string[] args)

{

var list = new List()

{

"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的绝妙方法,这么

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Tiger –UNIX:一款开源安全审计 入侵检测工具
下一篇:隐藏apache版本信息
相关文章

 发表评论

暂时没有评论,来抢沙发吧~