从Datatable的值中制作标题时遇到了麻烦。我有一个文本文件,我搜索一些字符串。拆分它们并将它们放入Datatable中。之后,我使用一些linq代码将列“Name”作为此表的标题。对于小文本文件,它工作得很好但是当我得到更大的文件时,我的编译器会抛出MemoryOutOfExeption。所以我问我如何修复我的代码?
我的代码:
DataTable evHeader00 = resAtt.Copy();
var prds1 = evHeader00.AsEnumerable() // make Name Values as header
.GroupBy(c => c["Name"])
.Where(g => !(g.Key is DBNull))
.Select(g => (string)g.Key)
.ToList();
prds1.ForEach(p => evHeader00.Columns.Add(p, typeof(string))); // Here i got MemoryOutOfExeption
foreach (var row in evHeader00.AsEnumerable())
{
if (!(row["Name"] is DBNull))
{
row[(string)row["Name"]] = row["Products"];
}
}
DataTable 1:
ID Name Products
1 a A
2 b B
3 c C
... ... ...
结果:
ID a b c ...
1 A
2 B
3 C
... ... ... ... ...
答案 0 :(得分:2)
为什么需要复制整个DataTable
?
DataTable evHeader00 = resAtt.Copy();
为什么要在这里创建一个包含所有数据的新List<String>
?
var prds1 = evHeader00.AsEnumerable() // make Name Values as header
.GroupBy(c => c["Name"])
.Where(g => !(g.Key is DBNull))
.Select(g => (string)g.Key)
.ToList();
所以这应该更具可扩展性:
IEnumerable<string> data = resAtt.AsEnumerable()
.Where(r => !r.Field<string>("Name") == null)
.GroupBy(r => r.Field<string>("Name"))
.Select(g => g.Key);
或(正如@Rawling所评论的)使用Enumerable.Distinct
,它应该更加“内存友好”:
IEnumerable<string> data = resAtt.AsEnumerable()
.Where(r => !r.Field<string>("Name") == null)
.Select(r => r.Field<string>("Name"))
.Distinct();
现在您可以使用foreach
来枚举结果。