2

Datatable の値からヘッダーを作成するときに問題が発生しました。私はいくつかの文字列を検索するテキスト ファイルを持っています。それらを分割してDatatableに入れます。その後、いくつかの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.Distinctこれを使用すると、さらに「メモリフレンドリー」になります。

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

foreachこれで、を使用して結果を列挙できます。

于 2012-12-03T08:56:53.320 に答える