Поскольку ваш фрагмент вызывает операторы в обоих его циклах (выполнение присваивания во внутреннем цикле и вызов Rows.Add () во внешнем), это не очень хороший сценарий для использования LINQ в.
Если вы все еще хотите написать это более «функциональным» способом, лучшее, что вы, вероятно, можете сделать, это использовать метод расширения ForEach () вместо циклов, но код все равно в конечном итоге будет таким же и будет на самом деле не совсем использовать LINQ вообще.
Стараясь изо всех сил использовать LINQ здесь, вы получите что-то вроде этого:
listItem
.Select(item =>
{
var dataRow = dataTable.NewRow();
dataTableColumnNames
.Select(col => listType.GetProperty(col))
.Where(p => p != null)
.ForEach(p => dataRow[p.Name] = p.GetValue(item, null));
return row;
})
.ForEach(row => dataTable.Rows.Add(row));
Я использую свойство p.Name
вместо col
, чтобы упростить эту задачу, но общая функциональность должна быть такой же. Как отмечалось в других ответах, это также не улучшит читабельность.
Обратите внимание, что метод расширения ForEach () не включен в простой ванильный LINQ, и вам придется написать свой собственный, если у вас его еще нет.