2017-09-22 52 views
1

我想將文本文件轉換爲列表字典。這本字典是在單獨的類,BaseDict聲明,如:c# - 將文本文件轉換爲字典

public static Dictionary<string, List<string>> myLists = new Dictionary<string, List<string>>(); 

用於填充它是在一個不同的類,並且是該方法如下:

public void TextFileToDictionary2() 
    { 
     using (var sr = new StreamReader(File_Path)) 
     { 
      string line = null; 
      List<string> InputLineList = new List<string>(); 
      while ((line = sr.ReadLine()) != null) 
      { 
       InputLineList.Clear(); 

       // Slice Substrings 
       string AP = line.Substring(0, 7); 
       string Address = line.Substring(8, 45); 
       string JDate = line.Substring(54, 3); 
       string BMFline = line.Substring(57, 6); 
       string POD = line.Substring(68, 11); 
       string DateApok = line.Substring(79, 4); 
       string checkdigit1 = line.Substring(83, 1); 
       string poso = line.Substring(84, 9); 
       string checkdigit2 = line.Substring(93, 1); 
       string GDate = line.Substring(94, 8); 
       string AType = line.Substring(102, 2); 
       string NinPacket = line.Substring(106, 5); 

       // Construct List 
       InputLineList.Add(AP); 
       InputLineList.Add(Address); 
       InputLineList.Add(JDate); 
       InputLineList.Add(BMFline); 
       InputLineList.Add(POD); 
       InputLineList.Add(DateApok); 
       InputLineList.Add(checkdigit1); 
       InputLineList.Add(poso); 
       InputLineList.Add(checkdigit2); 
       InputLineList.Add(GDate); 
       InputLineList.Add(AType); 
       InputLineList.Add(NinPacket); 

       //Console.WriteLine(InputLineList[0] + InputLineList[1] + InputLineList[2]); 
       //BaseDict.niarxosfileadv.Add(POD, InputLineList); 
       BaseDict.myLists.Add(POD, InputLineList); 
       Console.WriteLine(BaseDict.myLists[POD][0] + BaseDict.myLists[POD][1] + BaseDict.myLists[POD][2]); 


      } 
      Console.WriteLine("#"); 
      Console.WriteLine(BaseDict.myLists["70503490702"][0] + BaseDict.myLists["70503490702"][1] + BaseDict.myLists["70503490702"][2]); 
      Console.WriteLine(BaseDict.myLists["33221051805"][0] + BaseDict.myLists["33221051805"][1] + BaseDict.myLists["33221051805"][2]); 

      foreach (KeyValuePair<string, List<string>> kvp in BaseDict.myLists) 
      { 
       Console.WriteLine("#"); 
       Console.WriteLine(kvp.Key + "@" + kvp.Value[0] + kvp.Value[1]); 
       Console.WriteLine(kvp.Key + "@" + BaseDict.myLists[kvp.Key][0] + BaseDict.myLists[kvp.Key][1]); 
      } 
     } 
    } 

和輸入文件看起來像這樣:

0000039#XXXXXX    25000YYYYYYY #1491505400010070503490702030750000078006201 
0000040#zzzzzz    21300FFFFFFF #1491487800010533221051805030720000245001201 

我的問題是,它似乎沒有像字典正確載入,這樣的說法:

BaseDict.myLists.Add(POD, InputLineList); 
Console.WriteLine(BaseDict.myLists[POD][0] + BaseDict.myLists[POD][1] + BaseDict.myLists[POD][2]); 

爲鍵值對生成正確的結果,但下面的(使用硬編碼鍵,循環後的鍵)只給出了字典中輸入的最後一個鍵的值。

+0

你確保所有的POD的名單是獨特? – BugFinder

+0

string POD = line.Substring(68,11);在這個例子中,因爲我已經編輯了這些行來刪除一些敏感信息,所以它看到下面的兩個硬編碼值: – onlyf

+0

70503490702,33221051805,那些正在由字符串POD = line.Substring生成...... – onlyf

回答

3

您在每個循環中重寫您的列表。列表是引用類型,所以你應該在每次循環創建新的列表,防止重寫數據字典

這也是更好地使用一些類而不是子的

List<string> InputLineList; 
      while ((line = sr.ReadLine()) != null) 
     { 
      InputLineList = new List<string>(); 
      // InputLineList.Clear(); 

      // Slice Substrings 
      string AP = line.Substring(0, 7); 
      string Address = line.Substring(8, 45); 
      string JDate = line.Substring(54, 3); 
      string BMFline = line.Substring(57, 6); 
      string POD = line.Substring(68, 11); 
      string DateApok = line.Substring(79, 4); 
      string checkdigit1 = line.Substring(83, 1); 
      string poso = line.Substring(84, 9); 
      string checkdigit2 = line.Substring(93, 1); 
      string GDate = line.Substring(94, 8); 
      string AType = line.Substring(102, 2); 
      string NinPacket = line.Substring(106, 5); 

      // Construct List 
      InputLineList.Add(AP); 
      InputLineList.Add(Address); 
      InputLineList.Add(JDate); 
      InputLineList.Add(BMFline); 
      InputLineList.Add(POD); 
      InputLineList.Add(DateApok); 
      InputLineList.Add(checkdigit1); 
      InputLineList.Add(poso); 
      InputLineList.Add(checkdigit2); 
      InputLineList.Add(GDate); 
      InputLineList.Add(AType); 
      InputLineList.Add(NinPacket); 

      //Console.WriteLine(InputLineList[0] + InputLineList[1] + InputLineList[2]); 
      //BaseDict.niarxosfileadv.Add(POD, InputLineList); 
      BaseDict.myLists.Add(POD, InputLineList); 
      Console.WriteLine(BaseDict.myLists[POD][0] + BaseDict.myLists[POD][1] + BaseDict.myLists[POD][2]); 


     } 
     ... 
+0

非常感謝您的及時響應。 – onlyf