2014-12-05 205 views
0

每次運行此代碼時,certlist都會讀取第一組值並將其成功寫入列表。當它再次通過循環時,下一組值將覆蓋第一個值並創建第二個值。最終結果是列表中有兩個相同的值。列表未正確填充

任何幫助它爲什麼會覆蓋第一個值,以及如何修復它會很好。

 foreach (var certcard in xdoc.Root.Element("Diver").Element("Certifications").Elements("Certification_Card")) 
     { 
      cert.Level = certcard.Element("Level").Value; 
      cert.Agency = certcard.Element("Agency").Value; 
      cert.Number = certcard.Element("Number").Value; 
      cert.Date = Convert.ToDateTime(certcard.Element("Date").Value); 

      certlist.Add(cert); 
     } 
+0

在循環內聲明'cert'。 – 2014-12-05 03:44:14

回答

0

試試這個:

foreach (var certcard in xdoc.Root.Element("Diver").Element("Certifications") 
     .Elements("Certification_Card")) 
    { 
     certlist.Add(new Cert() 
     { 
      Level = certcard.Element("Level").Value, 
      Agency = certcard.Element("Agency").Value, 
      Number = certcard.Element("Number").Value, 
      Date = Convert.ToDateTime(certcard.Element("Date").Value) 
     }); 
    } 
+0

完美工作。謝謝! – 2014-12-05 04:00:23

+0

不客氣.. @MattL – 2014-12-05 05:22:18

1

你原來的代碼只缺少證書的聲明:

foreach (var certcard in xdoc.Root.Element("Diver").Element("Certifications") 
     .Elements("Certification_Card")) 
    { 
     var cert = new Cert(); 
     cert.Level = certcard.Element("Level").Value; 
     cert.Agency = certcard.Element("Agency").Value; 
     cert.Number = certcard.Element("Number").Value; 
     cert.Date = Convert.ToDateTime(certcard.Element("Date").Value); 

     certlist.Add(cert); 
    } 

同樣,你可以使用LINQ做這沒有一個循環:

certlist.AddRange(xdoc.Root.Element("Diver") 
    .Element("Certifications") 
    .Elements("Certification_Card") 
    .Select(c => new Cert 
    { 
     Level = c.Element("Level").Value, 
     Agency = c.Element("Agency").Value, 
     Number = c.Element("Number").Value, 
     Date = Convert.ToDateTime(c.Element("Date").Value) 
    }));