Проблема в том, что вы обрабатываете только одну строку, когда делаете sr.ReadLine()
.Вместо этого вы можете рассмотреть возможность использования File.ReadAllLines
, который считывает все строки в массив.Вы можете комбинировать это с методом Split
, чтобы извлечь нужные элементы из каждой строки.
Ваш цикл for также не имеет смысла - кажется, что вы циклически повторяете каждое слово в строке, нов теле цикла вы добавляете все слова каждый раз.Я думаю, что цикл for
можно удалить.
Кроме того, неясно, что такое ec
, но вам, вероятно, следует создавать новый экземпляр на каждой итерации.В противном случае вы просто добавляете одну и ту же ссылку в ваш список снова и снова, и все они будут иметь одинаковые значения (из последней прочитанной строки).
Вот пример класса, который я использую:
// Class to represent whatever it is you're adding in your loop
class EC
{
public int Code { get; set; }
public string Name { get; set; }
public int Number { get; set; }
public string City { get; set; }
}
Одна вещь, которую мы должны сделать, прежде чем ссылаться на индексы в массиве, возвращаемом при вызове Split
, мы должны убедиться, что сначала достаточно элементов.В противном случае мы получим исключение IndexOutOfRange
, если попытаемся сослаться на индекс, который не существует.
Кроме того, неплохо бы убедиться, что строки, которые мы ожидаем получить как целые числа, на самом деле целых чисел.Мы можем сделать это с помощью int.TryParse
, который вернет true в случае успеха и установит аргумент out в проанализированное значение.
Вот пример, который использует все эти идеи:
// Path to our file
var filePath = @"f:\public\temp\temp.txt";
// The list of things we want to create from the file
var list = new List<EC>();
// Read the file and create a new EC for each line
foreach (var line in File.ReadAllLines(filePath))
{
string[] words = line.Split('\t');
// First make sure we have enough words to create an EC
if (words.Length > 3)
{
// These will hold the integers parsed from our words (if parsing succeeds)
int code, number;
// Use TryParse for any values we expect to be integers
if (int.TryParse(words[0], out code) && int.TryParse(words[3], out number))
{
list.Add(new EC
{
Code = code,
Name = words[1],
Number = number,
City = words[3]
});
}
}
}