您应该在这个人的名字上创建一个分组,也可能在一个列表中选择价格。下面的模型应该可以工作。
class Person
{
public string Name { get; set; }
public int Hour { get; set; }
public decimal Price1 { get; set; }
public decimal Price2 { get; set; }
public decimal Price3 { get; set; }
public decimal Price4 { get; set; }
public decimal Price5 { get; set; }
}
…
List<Person> people = new List<Person>()
{
new Person() { Name = "Fred", Hour = 3, Price1 = 12.5m, Price2 = 13.5m, Price3 = 14, Price4 = 15, Price5 = 16 },
new Person() { Name = "Fred", Hour = 6, Price1 = 10, Price2 = 11, Price3 = 14, Price4 = 15, Price5 = 19.7m },
new Person() { Name = "Dave", Hour = 6, Price1 = 8, Price2 = 12, Price3 = 18, Price4 = 20.2m, Price5 = 25 }
};
var query = from p in people
group p by p.Name into pg
select new
{
Name = pg.Key,
Records = from record in pg
select new
{
Hour = record.Hour,
Prices = new List<Decimal>() { record.Price1, record.Price2, record.Price3, record.Price4, record.Price5 }
}
};
XDocument document = new XDocument(new XElement("timeCost",
from person in query
select new XElement("person", new XAttribute("name", person.Name),
from record in person.Records
select new XElement("time", new XAttribute("hour", record.Hour),
from price in record.Prices
select new XElement("cost", new XAttribute("price", price))))));
xdocument现在看起来像这样
<timeCost>
<person name="Fred">
<time hour="3">
<cost price="12.5" />
<cost price="13.5" />
<cost price="14" />
<cost price="15" />
<cost price="16" />
</time>
<time hour="6">
<cost price="10" />
<cost price="11" />
<cost price="14" />
<cost price="15" />
<cost price="19.7" />
</time>
</person>
<person name="Dave">
<time hour="6">
<cost price="8" />
<cost price="12" />
<cost price="18" />
<cost price="20.2" />
<cost price="25" />
</time>
</person>
</timeCost>