Luca Romagnoli
Luca Romagnoli

Reputation: 12455

convert string[] to int[]

Which is the fastest method for convert an string's array ["1","2","3"] in a int's array [1,2,3] in c#?

thanks

Upvotes: 12

Views: 6410

Answers (7)

Denis Palnitsky
Denis Palnitsky

Reputation: 18387

I suggest to iterate and int.TryParse()

Which one is faster in processing and conversion int.Parse(), int.TryParse(), Convert.Int32()

See Microsoft comparison of Parse , TryParse and ConvertTo

Upvotes: 2

user374191
user374191

Reputation: 121

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

Upvotes: 1

Sly
Sly

Reputation: 15217

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

Upvotes: 15

Marc Gravell
Marc Gravell

Reputation: 1062550

string[] arr1 = {"1","2","3"};
int[] arr2 = Array.ConvertAll(arr1, s => int.Parse(s));

The use of Array.ConvertAll ensures (unlike LINQ Select/ToArray) that the array is initialized at the right size. You can possible get a shade quicker by unrolling, but not much:

int[] arr2 = new int[arr1.Length];
for(int i = 0 ; i < arr1.Length ; i++) {
    arr2[i] = int.Parse(arr[i]);
}

If you need something faster still (perhaps bulk file/data handling), then writing your own parse might help; the inbuilt one handles a lot of edge-cases - if your data is simpler you really can cut this down a bit.


For an example of an alternative parser:

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

Upvotes: 24

Ed James
Ed James

Reputation: 10607

I'd probably do:

string[] array = new[] { "1", "2" }; // etc.
int[] ints = array.Select(x => int.Parse(x)).ToArray();

if I could guarantee that the data would be only integers.

if not:

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

Upvotes: 2

Dror Helper
Dror Helper

Reputation: 30790

The is no fast way I know but you can use a "short way":

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

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

And if you use PLink you get to compute the values in parallel.

Upvotes: 1

this. __curious_geek
this. __curious_geek

Reputation: 43207

iterate and convert.

Upvotes: 1

Related Questions