将字符串数组加载到List<int>中最优雅的方法是什么?

11
考虑一个包含数字值的字符串数组:

Consider an array of strings containing numerical values:

string[] intArray = {"25", "65" , "0"};

如何在不使用 forwhile 循环迭代 intArray 的情况下,将数字加载到 List<int> 中最优雅的方式是什么?


4
将 intArray 转换为列表: var list = intArray.ToList(); - Patryk Ćwiek
我可以问一下为什么你有一个字符串数组,里面是文本数字,但你真正想要的是整数吗?每当有人这样做时,我都不得不问:那个数组包含非数字的可能性有多大?如果机会为0,为什么不将其变成数字数组呢? - Lasse V. Karlsen
编辑器把我的<int>从问题中删除了!!但是它还在标题中。 - bobbyalex
@LasseV.Karlsen:它正在从一个CSV文件中读取。 - bobbyalex
4
为什么不使用一个真正的CSV解析器库,而是使用这里提供的简化版LINQ解决方案?如果你遇到格式错误的CSV文件,例如小数点与逗号混用、多出一列或一行非数字内容等问题,那么你的程序应该优雅地处理它们。 - Lasse V. Karlsen
1
@LasseV.Karlsen:为了避免不必要地使问题复杂化,让我们假设字符串的有效性已经得到了处理。 - bobbyalex
5个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
27
您可以使用Enumerable.Select方法。
List<int> intList = intArray.Select(str => int.Parse(str)).ToList();

18

(对Dmitry的回答进行补充)
你可以摒弃lambda,因为该方法已经具有正确的签名:

List<int> intList = intArray.Select(Int32.Parse).ToList();

3
请注意,这样做每次都会分配一个新的委托对象,而Dmitry的方法会使用一个缓存的对象。 - Cory Nelson
5
@CoryNelson 你确定吗? - Display Name
2
@PeterMajeed 这是一篇很好的博客文章,解释得非常清楚。 http://blog.filipekberg.se/2013/02/15/optimize-your-delegate-usage/ - Mariusz Pawelski
@SargeBorsch 我同意,希望他们能尽快在Roslyn中修复它。 - Mariusz Pawelski
@CichyK24 只有在循环内部引用委托时才相关。在这里,委托对象只创建一次,并将引用复制到参数中。除非整个Select/ToList语句在循环中,否则使用此方法不应该有任何性能劣势。 - Cyanfish
显示剩余2条评论

3

只需调用Select()函数:

using System.Linq;

var list = intArray.Select(x => Convert.ToInt32(x));

注意:我刚开始回答你的问题后,你修改了问题。


2

这是做法:

string[] intArray = { "25", "65", "0" };
List<int> intList = new List<int>(Array.ConvertAll(intArray, s => int.Parse(s)));

或者

 string[] intArray = { "25", "65", "0" };
 List<int> intList = new List<int>(intArray.Select(int.Parse).ToArray());

或者

 string[] intArray = { "25", "65", "0" };
 List<int> intList = new List<int>(Array.ConvertAll(intArray, int.Parse));

0

我很惊讶没有人提到int.TryParse

string[] intArray = { "25", "65", "0" };
int tempNumber;
List<int> list = intArray.Select(r => int.TryParse(r, out tempNumber) 
                                     ? tempNumber : -1)
                     .ToList();

这将处理无效的输入并返回 -1 作为值。(它可以是指定错误或 0 的任何数字)

如果 intArray 仅包含可解析整数,则以下内容将起作用:

List<int> list = intArray.Select(int.Parse).ToList();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,