使用linq展平列表(带有Yield返回)

时间:2012-05-15 09:55:55

标签: linq-to-xml yield

我有一个射击问题...... 我有一个xml文件,我想存储在元素列表中。

我希望将此列表展平,以便遵循另一个数据源给出的另一种模式。

这是一个xml示例

   <?xml version="1.0" encoding="utf-8" ?>    
   <Actors>
    <Actor FirstName="Will" LastName="Smith">
      <Movie name="Men in Black" Date="1999"/>
      <Movie name="Wild wild west" Date="1999"/>
      <Movie name="Ali" Date="2002"/>
    </Actor>
    <Actor FirstName="Jason" LastName="Statham">
     <Movie name="The Transporter" Date="2002"/>   
     <Movie name="Revolver" Date="2005"/>
     <Movie name="The Bank Job" Date="2008"/>
     <Movie name="Transporter 3" Date="2008"/>
    </Actor> 
 </Actors>

然后,我创建了一个我的对象

public class Actors
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Name { get; set; }
    public string Date { get; set; }
}

现在,我用这样的xlinq读取这个xml:

        private static void Read(string fileName)
    {
        XDocument testDoc = XDocument.Load(fileName);
        var reader = from c in testDoc.Root.Elements()
                     select c;


        var list = reader.ToList();



    }

现在我想填写每个项目的List ands,所有数据(FirstName,LastName,Name,Date)必须存在。

我认为Yield return必须解决我的问题,但实际上我并不清楚它是如何工作的。 (我想实施它)

由于

2 个答案:

答案 0 :(得分:1)

我想你只想要

List<Actors> actors = (from movie in XDocument.Load(fileName).Descendants("Movie")
  select new Actors() {
    FirstName = (string)movie.Parent.Attribute("FirstName"),
    LastName = (string)movie.Parent.Attribute("LastName")
    Name = (string)movie.Attribute("name"),
    Date = (string)movie.Attribute("Date")
 }).ToList();

答案 1 :(得分:0)

使用此查询

var reader = from a in testDoc.Root.Descendants("Actor")
             from m in a.Descendants("Movie")
             select new Actors
             {
                FirstName = a.Attribute("FirstName").Value,
                LastName = a.Attribute("LastName").Value,
                Name = m.Attribute("name").Value,
                Date = m.Attribute("Date").Value
             };