c# - 将数据放入DataTable中,得到MemoryOutOfExceptionion

标签 c# linq datatable out-of-memory

我在从数据表的值创建标题时遇到问题。我有一个文本文件,我在其中搜索一些字符串。将它们拆分并放入数据表中。之后,我使用一些 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
...   ... ... ...  ...    

最佳答案

  1. 为什么需要复制整个DataTable在这里?

    DataTable evHeader00 = resAtt.Copy();
    
  2. 为什么要创建一个新的 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/

相关文章:

c# - 如何使用数据表?

jquery - 如何引用同一元素中的另一个元素 <p :dataTable><p:column> using jQuery

c# - 为什么 EF 将 char 属性视为实际的 guid?

c# - .NET MailMessage 和 AlternativeViews 中的 DKIM

c# - LINQ to SharePoint 2010 出现错误 "All new entities within an object graph must be added/attached before changes are submitted."

c# - 如何在 LINQ 中实现动态 'where' 子句?

c# - DataTable,如何有条件地删除行

c# - 三元(条件)运算符与返回 Action 的 if 语句之间的区别

c# - 如何对在C#中使用LINQ使用反射找到的属性进行排序?

c# - 导出到 Excel 给我复选框而不是字符串