【问题标题】:convert string[] to int[]将字符串 [] 转换为 int []
【发布时间】:2010-06-21 09:41:20
【问题描述】:

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

谢谢

【问题讨论】:

  • 这些项目肯定只是字符串格式的整数吗?
  • @abatishchev - 相关,但可能不是重复; “使用 LINQ”!= “最快”
  • @Marc:你是对的。顺便说一句,OP 选择了 LINQ :)

标签: c# arrays string integer


【解决方案1】:
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;
                }
        }
    }

【讨论】:

    【解决方案2】:
    var values = new string[] { "1", "2", "3" };
    values.Select(x => Int32.Parse(x)).ToArray();
    

    【讨论】:

    • Int32.TryParse 比 Int32.Parse 更快
    • 这实际上并没有给出一个数组......也不是填充这样一个数组的“最快”(问题)方式。但除此之外......
    • 当a)它返回与您所要求的不同的数据结构并且b)Marc Gravell的答案比这里的其他答案好一个数量级时,这是如何被接受的答案?
    • 你可以写values.Select(Int32.Parse);为什么要添加那个lambda包装器?
    • 它被接受,但人们认为这是正确的答案。这与更好/最差、对/错或其他无关。也许问题只是措辞不正确?
    【解决方案3】:
    【解决方案4】:

    我可能会这样做:

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

    【讨论】:

      【解决方案5】:

      迭代和转换。

      【讨论】:

        【解决方案6】:

        我知道这不是快捷方式,但您可以使用“快捷方式”:

        var numbers = new[] {"1", "2", "3"};
        
        var result = numbers.Select(s => int.Parse(s));
        int[] resultAsArray = result.ToArray();
        

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

        【讨论】:

          【解决方案7】:
          string[] arr = new string[]{ "1", "2", "3" };
          int[] lss = (from xx in arr
                       select Convert.ToInt32(xx)).ToArray();
          

          【讨论】:

            猜你喜欢
            • 2011-10-02
            • 2011-03-06
            • 1970-01-01
            • 2018-07-05
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多