Это лучший способ в C # для преобразования строки с разделителями в массив int? - PullRequest
18 голосов
/ 28 апреля 2009

Учитывая строку ниже:

string str = "1,2,3";

Будет ли это лучшим расширением для преобразования его в массив int?

static class StringExtensions
{
    public static int[] ToIntArray(this string s)
    {
        return ToIntArray(s, ',');
    }
    public static int[] ToIntArray(this string s, char separator)
    {
        string[] ar = s.Split(separator);
        List<int> ints = new List<int>();
        foreach (var item in ar)
        {
            int v;
            if (int.TryParse(item, out v))
                ints.Add(v);
        }
        return ints.ToArray();
    }
}

Ответы [ 4 ]

40 голосов
/ 28 апреля 2009

Это действительно зависит от того, что вы хотите сделать с нецелыми строками. На данный момент вы молча бросаете их. Лично я бы хотел, чтобы это было ошибкой. Это также позволяет вам использовать более кратко:

public static int[] ToIntArray(this string value, char separator)
{
    return Array.ConvertAll(value.Split(separator), s=>int.Parse(s));
}
9 голосов
/ 28 апреля 2009

Этот подход очень лаконичен и будет выдавать (не очень информативно) FormatException, если разделенная строка содержит какие-либо значения, которые нельзя проанализировать как int:

int[] ints = str.Split(',').Select(s => int.Parse(s)).ToArray();

Если вы просто хотите отбросить любые значения не-int, попробуйте следующее:

private static int? AsNullableInt(string s)
{
    int? asNullableInt = null;

    int asInt;

    if (int.TryParse(s, out asInt))
    {
        asNullableInt = asInt;
    }

    return asNullableInt;
}

// Example usage...
int[] ints = str.Split(',')
    .Select(s => AsNullableInt(s))
    .Where(s => s.HasValue)
    .Select(s => s.Value)
    .ToArray();
5 голосов
/ 28 апреля 2009

Это взорвется, если один из ваших элементов в списке не будет проанализирован как int, что, вероятно, лучше, чем молчаливый сбой:

public static int[] ToIntArray(this string value, char separator)
{
    return value.Split(separator).Select(i => int.Parse(i)).ToArray();
}
0 голосов
/ 28 апреля 2009

Выглядит нормально, я бы также выдал исключение, если один из элементов не мог быть преобразован вместо молчаливого сбоя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...