2017-01-19 3 views
0

У меня есть список String [], который я пытаюсь преобразовать в набор данных/datatable с помощью LINQ. Я проанализировал текстовый файл в списке, в котором первая строка имеет 4 столбца, а другие - данные, связанные с столбцами.List Array to DataTable

Все появляется как массив в списке.

Список [10] где List [0] имеет строку [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 при работе со словарями .. поэтому столбцы добавляются в таблицу, если ее первая строка .. не уверен, как обрабатывать список здесь. Plz советует – 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

спасибо, добавив первую строку в виде столбцов. как добавить строки в datatbale в foreach, используя List list.ForEach (r => table.Rows.Add (r.Select (c => c.Value) .Cast () .ToArray())); – user1046415

+0

@ user1046415 Я обновил, но думаю об этом: если единственная проблема с первой заключается в том, что 'Value' там не принадлежало, то что вы должны сначала попробовать с другой линией? Оба они выбирают элементы в строковых массивах из того же списка. –

+0

Удивительное спасибо большое. Цените ур время – user1046415