Это лучший способ в С# преобразовать строку с разделителями в массив int?
С учетом строки ниже:
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();
}
}
Ответы
Ответ 1
На самом деле это зависит от того, что вы хотите делать с целыми целыми строками. В настоящий момент вы тихо их бросаете. Лично я бы хотел, чтобы он ошибся. Это также позволяет использовать более краткий:
public static int[] ToIntArray(this string value, char separator)
{
return Array.ConvertAll(value.Split(separator), s=>int.Parse(s));
}
Ответ 2
Этот подход очень точный и будет генерировать (не очень информативный) FormatException
, если строка split содержит любые значения, которые не могут быть проанализированы как 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();
Ответ 3
Это взорвется, если один из ваших элементов в списке не будет анализироваться как int, что, вероятно, лучше, чем просто сбой:
public static int[] ToIntArray(this string value, char separator)
{
return value.Split(separator).Select(i => int.Parse(i)).ToArray();
}
Ответ 4
Он выглядит нормально, я также выдавал бы исключение, если бы один из элементов не мог быть преобразован вместо молчащего отказа.