2014-09-20 70 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,然後它將它添加到列表中並當涉及到下一個Store ID時,請繼續進行foreach循環。

但問題是當我在列表中進行搜索時,它只能返回最終的記錄。看來列表只有一個元素,這是最終的記錄。任何人都可以請指出我錯在哪裏?

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 ',我們可以覆蓋它 – 2014-09-20 11:50:35

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(); 

你需要才能使用添加引用MoreLINQBatch方法。

0

你每次都在內存中爲storeTemp創建一個新的空間。目前您正在將數據寫入同一位置。

+0

在for循環中創建一個新的Store實例是正確的。但是應該在添加到List之後重新創建,就像Max的上面的答案一樣。如果我們把代碼放在你這裏,它會在讀取文件時爲每一行創建storeTemp – 2014-09-20 12:05:35

0

只要改變存儲的類型從ClassStruct

相關問題