我有一个通用数据表,其中包含任意数量的列和任意数量的行,如果行的列包含引号(" )。
e.g。
快速的棕色"狐狸"跳过懒惰的狗#34;
我希望这是
一只快速的棕色狐狸跳过懒狗
快照
我试过了
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循环遍历列,然后是行,然后替换文本。
答案 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();