Substring
завершится ошибкой, если possibleInt
содержит менее двух символов, поэтому вы должны добавить этот тест в свой код.Я подозреваю, что ваш Split
вызов производит пустую строку при некоторых обстоятельствах.Эта пустая строка передается в ваш анализатор int, который затем завершается ошибкой при вызове Substring
.Таким образом, вы, вероятно, должны сделать две вещи:
- Избавиться от пустых строк в разбиении
- Обрабатывать короткие или пустые строки преднамеренно в коде синтаксического анализа
Избавиться от пустых строк довольно просто:
var parsed = File.ReadLines(filename)
.Select(line => line.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries)
.Select(MyIntegerParse)
.ToArray())
.ToArray();
Добавление преднамеренной обработки пустых строк можно сделать так:
static int MyIntegerParse(string possibleInt)
{
if (string.IsNullOrEmpty(possibleInt) || possibleInt.Length < 2)
{
return 0;
}
int i;
return int.TryParse(possibleInt.Substring(2), out i) ? i : 0;
}
... или если вы являетесь поклонникомкомпактные и трудно читаемые конструкции:
static int MyIntegerParse(string possibleInt)
{
int i;
return (!string.IsNullOrEmpty(possibleInt)
&& possibleInt.Length >= 2
&& int.TryParse(possibleInt.Substring(2), out i)) ? i : 0;
}
Нет, я решил вернуть 0
, когда получаю слишком короткие строки.В вашем случае может иметь смысл вернуть какое-то другое значение, сгенерировать исключение или использовать оператор Debug.Assert
.