列表数组到DataTable

时间:2017-01-19 19:50:56

标签: c# linq list datatable

我有一个String []列表,我试图使用LINQ将其转换为数据集/数据表。 我将文本文件解析为列表,其中第一行有4列,其他行有与列关联的数据。

所有内容都以列表中的数组形式出现。

List [10]其中List [0]有字符串[4]项。

List<string[]> list = File.ReadLines(s)
    .Select(r => r.TrimEnd('#'))
    .Select(line => line.Split(';'))
    .ToList();

DataTable table = new DataTable();

table.Columns.AddRange(list.First().Select(r => new DataColumn(r.Value)).ToArray());

list = list.Skip(1).ToArray().ToList();

list.ForEach(r => table.Rows.Add(r.Select(c => c.Value).Cast<object>().ToArray()));

LINQ不接受Value属性。

有人可以建议这种实施的简单而有效的方法吗?

1 个答案:

答案 0 :(得分:2)

System.String没有名为Value的媒体资源。

如果要为第一行中的每个项目创建一个列,只需为其指定字符串:

table.Columns.AddRange(list.First().Select(r => new DataColumn(r)).ToArray());

//  You don't need ToArray() here. 
list = list.Skip(1).ToList();

//  Get rid of Value in this line too, and you don't need 
//  .Select(c => c) either -- that's a no-op so leave it out.
list.ForEach(row => table.Rows.Add(row.Cast<object>().ToArray()));

这里没有字典。 list.First()是一个字符串数组。当您在数组上调用Select时,它只是将数组中的每个项依次传递给lambda。

Dictionary<TKey,TValue>.Select()传递lambda一系列KeyValuePair<TKey, TValue>。不同的阶级,不同的行为。