在C#中将字符串数组 ["1","2","3"] 转换为整数数组 [1,2,3] 的最快方法是什么?
谢谢
string[] arr1 = {"1","2","3"};
int[] arr2 = Array.ConvertAll(arr1, s => int.Parse(s));
使用 Array.ConvertAll
确保数组被正确初始化大小,这与 LINQ 的 Select
/ToArray
不同。你可能能够通过展开循环快一点,但是差别不会很大:
int[] arr2 = new int[arr1.Length];
for(int i = 0 ; i < arr1.Length ; i++) {
arr2[i] = int.Parse(arr[i]);
}
如果您需要更快的解析速度(例如批量文件/数据处理),那么编写自己的解析器可能会有所帮助;内置的解析器处理了许多边缘情况 - 如果您的数据更简单,则您确实可以将其缩减一些。以下是替代解析器的示例:
public static unsafe int ParseBasicInt32(string s)
{
int len = s == null ? 0 : s.Length;
switch(s.Length)
{
case 0:
throw new ArgumentException("s");
case 1:
{
char c0 = s[0];
if (c0 < '0' || c0 > '9') throw new ArgumentException("s");
return c0 - '0';
}
case 2:
{
char c0 = s[0], c1 = s[1];
if (c0 < '0' || c0 > '9' || c1 < '0' || c1 > '9') throw new ArgumentException("s");
return ((c0 - '0') * 10) + (c1 - '0');
}
default:
fixed(char* chars = s)
{
int value = 0;
for(int i = 0; i < len ; i++)
{
char c = chars[i];
if (c < '0' || c > '9') throw new ArgumentException("s");
value = (value * 10) + (c - '0');
}
return value;
}
}
}
var values = new string[] { "1", "2", "3" };
values.Select(x => Int32.Parse(x)).ToArray();
values.Select(Int32.Parse);
,为什么要添加那个lambda包装器呢? - Andrey我可能会这样做:
string[] array = new[] { "1", "2" }; // etc.
int[] ints = array.Select(x => int.Parse(x)).ToArray();
如果我能保证数据只包含整数。
如果不行:
string[] array = new[] { "1", "2" }; // etc.
List<int> temp = new List<int>();
foreach (string item in array)
{
int parsed;
if (!int.TryParse(item, out parsed))
{
continue;
}
temp.Add(parsed);
}
int[] ints = temp.ToArray();
我不知道有什么快速方法,但你可以使用“捷径”:
var numbers = new[] {"1", "2", "3"};
var result = numbers.Select(s => int.Parse(s));
int[] resultAsArray = result.ToArray();
如果您使用 PLink,您可以并行计算值。
string[] arr = new string[]{ "1", "2", "3" };
int[] lss = (from xx in arr
select Convert.ToInt32(xx)).ToArray();
迭代和转换。