Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将数据放入DataTable,获得MemoryOfExection_C#_Linq_Datatable_Out Of Memory - Fatal编程技术网

C# 将数据放入DataTable,获得MemoryOfExection

C# 将数据放入DataTable,获得MemoryOfExection,c#,linq,datatable,out-of-memory,C#,Linq,Datatable,Out Of Memory,从Datatable的值生成标头时遇到问题。我有一个文本文件,我在其中搜索一些字符串。将它们拆分并放入数据表中。之后,我使用一些linq代码将列“Name”作为该表的标题。对于小的文本文件,它工作得很好,但当我得到小的更大的文件时,我的编译器抛出MemoryOutOfExeption。所以我在问我如何修复我的代码 我的代码: DataTable evHeader00 = resAtt.Copy(); var prds1 = evHeader00.AsEnumer

从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"];
            }
        }
数据表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();
    
  • 为什么要在这里创建一个包含所有数据的新的
    列表

    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);
    

    现在,您可以使用
    foreach
    枚举结果。

    有多少行有“稍大的文件”如果编译器抛出异常,则不是数据。问题是,它真的是编译器吗?因此,在执行代码时不是这样吗?最好选择不同的
    “Name”
    值,而不是按
    “Name”
    值分组,然后只选择键。蒂姆:所以我使用了代码u give me
    var prds1=resAtt.AsEnumerable()。其中(r=>!(r.Field(“Name”)==null)).Select(r=>r.Field(“Name”)).Distinct().ToList();prds1.ForEach(p=>resAtt.Columns.Add(p,typeof(string))但它会抛出相同的错误。MemoryOutOfException@LeVietHung你看到我回答的第二点了吗您不需要创建新列表,只需使用
    foreach
    枚举查询即可。请注意,不是这样!蒂姆:好的,我用foreach
    foreach(prds1中的字符串st){resAtt.Columns.Add(st);}
    更改了我的代码,但是同样的错误,我在这里做错了什么吗?@LeVietHung:但是你真的得到了
    Distinct
    的异常吗?您是否试图省略
    不同的
    ,只是为了确保是它引起的?您在resAtt.columns.Add中创建了多少列?
    IEnumerable<string> data = resAtt.AsEnumerable()
                                     .Where(r => !r.Field<string>("Name") == null)
                                     .Select(r => r.Field<string>("Name"))
                                     .Distinct();