在所有列中更新和替换数据表行值

时间:2017-11-22 07:46:48

标签: c# .net linq datatable dataset

我有一个通用数据表,其中包含任意数量的列和任意数量的行,如果行的列包含引号(" )。

e.g。

快速的棕色"狐狸"跳过懒惰的狗#34;

我希望这是

一只快速的棕色狐狸跳过懒狗

快照

enter image description here

我试过了

var rows = dt.AsEnumerable().Where(r => r.Field<string>("display").Contains("\""));

在这种情况下,列名称为&#34;显示&#34; 是列名称,我不想提及。因为这不是固定的,因为引用(&#34;)可以在任何列的行中。

我的问题是我找不到我试过的特定列。它会给我所有列但不是特定的列。

string[] columnNames = dt.Columns.Cast<DataColumn>().Select(x => x.ColumnName).ToArray();

任何提示? 我不希望传统的foreach循环遍历列,然后是行,然后替换文本

2 个答案:

答案 0 :(得分:2)

您可以这样做:

//get columns which are of type "string" and then get their names
var columnNames = dt.Columns.OfType<DataColumn>().Where(c => c.DataType == typeof(string)).Select(c => c.ColumnName).ToList();

//get all dataTable's rows and with each column name (from previous step) get row's value of that column
// and if that value contains double qoutes, replace it with empty char :)
dt.AsEnumerable().ToList().ForEach(
    r => columnNames.ForEach(c => r.SetField<string>(c, r.Field<string>(c).Replace("\"", ""))));

//or, as one-liner :)
dt.AsEnumerable().ToList()
    .ForEach(r => dt.Columns.OfType<DataColumn>()
        .Where(c => c.DataType == typeof(string))
        .Select(c => c.ColumnName).ToList()
            .ForEach(c => r.SetField<string>(c, r.Field<string>(c).Replace("\"", ""))));

我猜这可以实现更简单一点,但这可以给你一个想法:)

答案 1 :(得分:0)

这是获取dataTable中包含引号的所有单元格列表的另一种方法。

然后,您可以对结果执行ForEach以删除引号。

var result = (from DataColumn column in table.Columns
             let columnName = column.ColumnName                     
             from DataRow row in table.AsEnumerable()
             where row[columnName].ToString().Contains("\"")
             select row[columnName]).ToList();