我有一个XML,我使用LINQ to XML。因为我想捕获一些元素/属性数据,所以我把它们放在一个字符串数组中。后来我使用foreach循环将这些值从字符串数组插入到DataRow中;因为我的最终目标是从中获取DataTable。
以下是我的代码
System.Data.DataTable dt = new System.Data.DataTable();
dt.Columns.Add("col_1");
dt.Columns.Add("col_2");
dt.Columns.Add("col_3");
string[] arr = new string[3];
var myData = from n in doc.Descendants("product")
select new string[]{
arr[0] = n.Attribute("name").Value,
arr[1] = n.Attribute("prodid").Value,
arr[2] = n.Attribute("price").Value
};
foreach (var item in myData)
{
dt.Rows.Add(item[0],item[1],item[2]);
}
是否可以组合这些并直接从LINQ查询获取输出作为DataTable而不是使用foreach?
我可以使用select new string[]
或select new DataTable
的实例来代替DataTable
吗?
我知道我的表结构应该是固定的。
更新
谢谢@CodingDawg& @Rahul Singh,我现在想知道这两者之间的最佳方法。
我将检查我的样本数据以进行比较。
但根据您的经验,哪一个更好地考虑大数据(10000个元素=> 10000行)?
答案 0 :(得分:3)
有办法将整个XML加载到DataSet中,但我想你需要一些特定的值,还需要做一些自定义过滤或填充,因此你使用 Linq-to-XML ,你可以投影数据表直接不使用 foreach 循环,如下所示: -
DataTable myData = doc.Descendants("product")
.Select(x =>
{
var row = dt.NewRow();
row.SetField<string>("col_1", (string)x.Attribute("name"));
row.SetField<string>("col_2", (string)x.Attribute("prodid"));
row.SetField<string>("col_1", (string)x.Attribute("price"));
return row;
}).CopyToDataTable();
myData
将保留结果dataTable。
答案 1 :(得分:0)
使用Linq .ToList()。ForEach()函数
System.Data.DataTable dt = new System.Data.DataTable();
dt.Columns.Add("col_1");
dt.Columns.Add("col_2");
dt.Columns.Add("col_3");
doc.Descendants("product")
.ToList()
.ForEach(
n => dt.Rows.Add(n.Attribute("name").Value,
n.Attribute("prodid").Value,
n.Attribute("price").Value));