大家好我有3节课如下
public class Main
{
public List<B> BList{ get; set; }
}
public class B
{
public B()
{
ListA = new List<A>();
}
public string FirstName { get; set; }
public string LastName { get; set; }
public string Email { get; set; }
public List<A> ListA { get; set; }
}
public class A
{
public int Rating { get; set; }
public int Weightage { get; set; }
}
我正在尝试在添加数据后使用linq将其转换为XML
Main main = new Main ();
var xEle = new XElement("Root",
from x in main.BList
from te in x.A
select new XElement("Child",
new XElement("Weightage", te.Weightage),
new XElement("FName", x.FirstName),
new XElement("LName", x.Email) ));
这给我输出如下
<Root>
<Child>
<Weightage>20</Weightage>
<FName>ABC</FName>
<LName>abc@abc.com</LName>
</Child>
<Child>
<Weightage>20</Weightage>
<FName>ABC</FName>
<LName>abc@abc.com</LName>
</Child>
</Root>
我需要的是如下
<Root>
<Child>
<Weightage>10</Weightage>
<FName>ABC</FName>
<LName>abc@abc.com</LName>
</Child>
<Child>
<Weightage>20</Weightage>
<FName>ABC</FName>
<LName>abc@abc.com</LName>
</Child>
</Root>
Fiddler https://dotnetfiddle.net/x6Hj01
答案 0 :(得分:5)
问题:
您的问题不在于linq,而在于您如何填充数据:
Master m=new Master();
m.BList =new List<B>();
B b=new B();
b.FirstName ="ABC";
b.Email="abc@abc.com";
A a=new A(); //Line 1
a.Rating = 1;
a.Weightage =10;
b.ListA.Add(a); //Line 2
a.Rating = 2; <--- problem here
a.Weightage =20;
b.ListA.Add(a); //Line 3
m.BList.Add(b);
只实例化a
一个(在“第1行”),然后用数据填充它并将其添加到列表中(在“第2行”)。然后重新分配数据并将其再次添加到列表中(在“第3行”)。
当您再次将值分配到a
时,您实际上仍在更新与之前相同的引用。因此,您在列表中获得两次相同的对象并使用相同的值,因为它是同一个对象。
解决方案:
要解决此问题,请在问题行之前添加A a = new A()
。
建议和改进:
更清晰的方法就是使用对象初始值设定项:
Master m=new Master
{
BList = new List<B>
{
FirstName = "ABC",
Email = "abc@abc.com",
AList = new List<A>
{
new A { Rating = 1, Weightage = 10 },
new A { Rating = 1, Weightage = 20 },
}
}
};
关于构建xml的方法我建议使用 序列化。 Look here for some examples
另一项改进是以这种方式初始化集合: (可能来自C#6.0)
public class Main
{
public List<B> BList { get; set; } = new List<B>()
}
public class B
{
public List<A> ListA { get; set; } = new List<A>()
}
答案 1 :(得分:0)