2014-09-20 2 views
0

У меня есть текстовый файл, подобный этому. Я хотел бы читать строки за строкой и хранить эту информацию в List<Store>, с Store - это нестандартные типы.Прочтите текстовый файл и добавьте в список

Store ID: 01 
Name: Kingfisher 
Branch Number: 1 
Address: 23 Emerson St 
Phone: 422361609 
-----END OF RECORD----- 

Store ID: 02 
Name: Harvey 
Branch Number: 2 
Address: 23 Korby St 
Phone: 422361609 
-----END OF RECORD----- 

Store ID: 175 
Name: Roger 
Branch Number: 4 
Address: 275 Carmody Rd 
Phone: 428395719 
-----END OF RECORD----- 

Вот что я использую. Поскольку запись всегда выполняется в порядке, указанном в списке, поэтому я читаю строки за строкой и назначаю store.ID, store.name, ... пока не достигнет конечного атрибута записи store.phoneNumber, он затем добавит его в список и продолжайте движение в цикле foreach, когда дело доходит до следующего Store ID.

Но проблема в том, что когда я выполняю поиск в списке, он может вернуть только окончательную запись. Кажется, что в списке только один элемент, который является окончательной записью. Кто-нибудь может указать, где я ошибаюсь?

var storeTemp = new Store(); 
    List<Store> stores = new List<Store>(); 
    foreach (string line in File.ReadAllLines(@"C:\Store.txt")) 
    { 
     if (line.Contains("Store ID: ")) 
      storeTemp.ID = line.Substring(10); 
     if (line.Contains("Name: ")) 
      storeTemp.name = line.Substring(6); 
     if (line.Contains("Branch Number: ")) 
      storeTemp.branchNO = Convert.ToInt32(line.Substring(15)); 
     if (line.Contains("Address: ")) 
      storeTemp.address = line.Substring(9); 
     if (line.Contains("Phone: ")) 
     { 
      storeTemp.phoneNumber = Convert.ToInt32(line.Substring(7)); 
      stores.Add(storeTemp); 
     } 
    } 

ответ

1
 List<Store> stores = new List<Store>(); 
      var storeTemp = new Store(); 

     foreach (string line in File.ReadAllLines(@"C:\Store.txt")) 
     { 
      // You needto create a new instance each time 
      if (line.Contains("Store ID: ")) 
       storeTemp.ID = line.Substring(10); 
      if (line.Contains("Name: ")) 
       storeTemp.name = line.Substring(6); 
      if (line.Contains("Branch Number: ")) 
       storeTemp.branchNO = Convert.ToInt32(line.Substring(15)); 
      if (line.Contains("Address: ")) 
       storeTemp.address = line.Substring(9); 
      if (line.Contains("Phone: ")) 
      { 
       storeTemp.phoneNumber = Convert.ToInt32(line.Substring(7)); 
       stores.Add(storeTemp); 
       storeTemp = new Store(); // You need to recreate the object, otherwise you overwrite same instance 

      } 
     } 
+0

удивительным! Большое спасибо. Я подумал, как только мы добавим 'storeTemp' в' List ', мы можем перезаписать его –

4

Я хотел бы использовать LINQ вместо и метод Batch для создания партий линий, так что вы можете установить свойства легко:

File.ReadLines("path") 
.Batch(5) 
.Select(x => x.ToList()) 
.Select(values => new Store 
        { 
        ID = values[0].Split(':').Trim(), 
        name = values[1].Split(':').Trim(), 
        branchNo = int.Parse(values[2].Split(':').Trim()), 
        address = values[3].Split(':').Trim(), 
        phoneNumber =int.Parse(values[4].Split(':').Trim()) 
        }.ToList(); 

Вам нужно добавить ссылку на MoreLINQ библиотеку, чтобы использовать Batch способ.

0

Вы много создаете новое пространство в памяти для storeTemp каждый раз. В настоящее время вы переписываете данные в том же месте.

+0

создать новый экземпляр Store в цикле for, это правильно. Но он должен быть воссоздан после добавления в Список, например, ответа Макса выше. Если мы поместим такой код, как вы, он будет создавать storeTemp для каждой строки при чтении файла –

0

Просто измените тип магазина от Class к Struct

Смежные вопросы