2017-01-19 22 views
0

私はLINQを使用してデータセット/データテーブルに変換しようとしているString []のリストを持っています。 最初の行が4列で、他の列が列に関連付けられたデータを持つテキストファイルを解析しました。List Array to DataTable

すべてがリストの配列として表示されます。

List [10] List [0]にはstring [4]個の項目があります。

List<string[]> list = File.ReadLines(s) 
    .Select(r => r.TrimEnd('#')) 
    .Select(line => line.Split(';')) 
    .ToList(); 

DataTable table = new DataTable(); 

table.Columns.AddRange(list.First().Select(r => new DataColumn(r.Value)).ToArray()); 

list = list.Skip(1).ToArray().ToList(); 

list.ForEach(r => table.Rows.Add(r.Select(c => c.Value).Cast<object>().ToArray())); 

LINQはValueプロパティを受け入れません。

この実装では、シンプルで効率的な方法を提案する人がいますか?

+0

* "LINQはValueプロパティを受け入れません" * - LINQがValueプロパティを受け入れないという独自の知覚的、主観的な経験を記述できますか? –

+0

辞書を使って作業するときにvalueプロパティを使用しました。そのため、最初の行がリストに追加されているため、列が追加されています。リストの処理方法がわからない場合は、 – user1046415

答えて

1

System.Stringは、Valueという名前のプロパティを持っていません。

あなたはそれに文字列を与え、最初の行の各項目の列を作成する場合:

table.Columns.AddRange(list.First().Select(r => new DataColumn(r)).ToArray()); 

// You don't need ToArray() here. 
list = list.Skip(1).ToList(); 

// Get rid of Value in this line too, and you don't need 
// .Select(c => c) either -- that's a no-op so leave it out. 
list.ForEach(row => table.Rows.Add(row.Cast<object>().ToArray())); 

ここには辞書がありません。 list.First()は文字列の配列です。配列のSelectを呼び出すと、配列内の各項目が順番にラムダに渡されます。

Dictionary<TKey,TValue>.Select()は、ラムダシリーズにKeyValuePair<TKey, TValue>を渡します。異なるクラス、異なる行動。

+0

、最初の行を列として追加してください。どのようにリストリストを使用してforeach内のデータベールに行を追加するのですか?ForEach(r => table.Rows.Add(r.Select(c => c.Value).Cast ().ToArray()))); – user1046415

+0

@ user1046415私は更新しましたが、それについて考えてみましょう:最初のもので唯一の問題は、「価値」がそこに属していなかった場合、最初に他の行で何を試してみるべきですか?どちらも同じリストから文字列配列内の項目を選択しています。 –

+0

すごくおかげさまです..ありがとうございました – user1046415