HOWTO · Csharp
在 C# 中将字符串数组转换为 Int 数组
在本指南中,我们将学习如何在 C# 中将字符串数组转换为 int 数组。
本页内容
本指南介绍如何在 C# 中将 string 数组转换为 int 数组。由于每个元素都以文本形式传入,因此必须把每个值解析为整数。有三种模式可以完成这项任务:Array.ConvertAll、使用 int.Parse 的 LINQ Select 投影,以及由 int.TryParse 支持的同一投影(用于可能无法顺利解析的输入)。
使用 Array.ConvertAll 转换字符串数组
Array.ConvertAll 会对源数组中的每个元素应用一个转换函数,并返回目标类型的新数组。将 int.Parse 方法组作为转换器传入,即可在一条语句中解析每个字符串。
运行以下示例:
本节中的代码以及显示的标签或输出仍为英文。
using System;
class Program {
static void Main() {
string[] temp_str = new string[] { "1000", "2000", "3000" };
int[] temp_int = Array.ConvertAll(temp_str, int.Parse);
foreach (int num in temp_int) {
Console.WriteLine(num);
}
}
}
1000
2000
3000
结果是一个新的 int[];原来的 string[] 保持不变。当每个元素都需要以相同方式转换、且不需要进一步投影时,Array.ConvertAll 是很好的默认选择。由于实际执行转换的是 int.Parse,每个元素都必须是 Int32 范围内格式正确的整数,后续章节介绍的解析规则在这里同样适用。
使用 LINQ Select 和 int.Parse 转换字符串数组
LINQ 的 Select 方法通过一个函数对源序列的每个元素进行投影。Select(int.Parse) 产生的是 IEnumerable<int> 而不是数组,因此需要 ToArray 才能将结果具体化为 int[]。当转换是更长的 LINQ 管道的一部分时(例如在解析之前先过滤值),这种写法十分自然。
运行以下示例:
本节中的代码以及显示的标签或输出仍为英文。
using System;
using System.Linq;
class Program {
static void Main() {
string[] temp_str = new string[] { "1000", "2000", "3000" };
int[] temp_int = temp_str.Select(int.Parse).ToArray();
foreach (int num in temp_int) {
Console.WriteLine(num);
}
}
}
1000
2000
3000
请注意,Select 是惰性求值的:在枚举序列之前不会解析任何内容,而 ToArray 恰好执行一次枚举。int.Parse 是严格的——当值不是数字时抛出 FormatException,当值超出 Int32 范围时抛出 OverflowException。上面两种模式都具有这种行为,这正是第三种方法要解决的问题。
使用 int.TryParse 处理无效值
int.TryParse 返回 bool 而不是抛出异常,因此可以容忍无法解析的值;它会把解析出的数字写入一个 out 参数,lambda 将其暴露为 result。在 Select 内部,lambda 在解析成功时返回解析出的值,否则返回选定的回退值。下面的程序对任何解析失败的值都替换为 0:
本节中的代码以及显示的标签或输出仍为英文。
using System;
using System.Linq;
class Program {
static void Main() {
string[] temp_str = new string[] { "1000", "abc", "3000" };
int[] temp_int = temp_str.Select(s => int.TryParse(s, out int result) ? result : 0).ToArray();
foreach (int num in temp_int) {
Console.WriteLine(num);
}
}
}
1000
0
3000
请慎重选择回退值:替换进去的 0 与结果中真实存在的 0 无法区分。如果这种歧义不可接受,就单独记录失败项——过滤掉无法解析的值、使用 -1 之类的哨兵值,或者把有问题的字符串收集起来用于日志记录。
要在这些模式之间快速取舍:只需要一次直接调用即可完成转换时,使用 Array.ConvertAll;转换位于 LINQ 管道内部时,使用 Select 搭配 int.Parse;输入不可信且有文档化的回退值可接受时,使用 int.TryParse。