将字符串数组转换为整数数组

12

在C#中将字符串数组 ["1","2","3"] 转换为整数数组 [1,2,3] 的最快方法是什么?

谢谢


2
这些项目是否确定只是字符串格式的整数? - Ed James
请参见以下链接:https://dev59.com/3HM_5IYBdhLWcg3wn0rT - abatishchev
@abatishchev - 相关,但可能不是重复的; "使用LINQ"!=“最快” - Marc Gravell
@Marc:你说得对。顺便说一下,OP选择了LINQ :) - abatishchev
7个回答

24
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;
                }
        }
    }

15
var values = new string[] { "1", "2", "3" };
values.Select(x => Int32.Parse(x)).ToArray();

1
Int32.TryParse 比 Int32.Parse 更快。 - Denis Palnitsky
1
这实际上并没有提供一个数组...也不是填充这样一个数组的“最快”(问题)方式。但除此之外... - Marc Gravell
1
这怎么成为被接受的答案了,当它返回一个与你要求的不同的数据结构,并且Marc Gravell的答案比这里其他所有答案都好一个数量级? - Ed James
你可以写values.Select(Int32.Parse);,为什么要添加那个lambda包装器呢? - Andrey
@Ed Woodcock:只需看一下所有得到赞的非ConvertAll答案即可。 - AMissico
显示剩余5条评论

2

我可能会这样做:

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();

2
我建议使用迭代和 int.TryParse()。
请查看微软对 Parse、TryParse 和 ConvertTo 的比较,链接为这里。同时,你也可以参考这篇文章了解处理和转换速度更快的方法。

1

我不知道有什么快速方法,但你可以使用“捷径”:

var numbers = new[] {"1", "2", "3"};

var result = numbers.Select(s => int.Parse(s));
int[] resultAsArray = result.ToArray();

如果您使用 PLink,您可以并行计算值。


1
string[] arr = new string[]{ "1", "2", "3" };
int[] lss = (from xx in arr
             select Convert.ToInt32(xx)).ToArray();

1

迭代和转换。


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