2014-12-05 155 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) 
    }));