2

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

1 回答 1

2
  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.Distinctwhich 应该更加“内存友好”:

IEnumerable<string> data = resAtt.AsEnumerable()
                                 .Where(r => !r.Field<string>("Name") == null)
                                 .Select(r => r.Field<string>("Name"))
                                 .Distinct();

现在您可以使用 aforeach来枚举结果。

于 2012-12-03T08:56:53.320 回答