我在从数据表的值创建标题时遇到问题。我有一个文本文件,我在其中搜索一些字符串。将它们拆分并放入数据表中。之后,我使用一些 linq 代码将“名称”列作为该表的标题。对于小文本文件,它工作得很好,但是当我得到更大的文件时,我的编译器会抛出 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"];
}
}
数据表1:
ID Name Products
1 a A
2 b B
3 c C
... ... ...
结果:
ID a b c ...
1 A
2 B
3 C
... ... ... ... ...
最佳答案
为什么需要复制整个
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
枚举结果。
关于c# - 将数据放入DataTable中,得到MemoryOutOfExceptionion,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13679822/