【问题标题】:C# DataTable select columns where column name likeC# DataTable 选择列名喜欢的列
【发布时间】:2017-07-28 20:02:26
【问题描述】:

我想选择 DataTable 中以字符“hz”开头的所有列。目前我正在这样做:

var uploadTable = dataTable.DefaultView.ToTable(false, "locID", "hz1582", "hz1581", "hz1580", "hz1579", "hz1578", "hz1577", "hz1576", "hz1575", "hz1574", "hz1573", "hz1572", "hz1571");

但是,每次运行代码时,“hz”列都是可变的,因此我需要某种方式来选择表中以 hz 开头的所有列。另请注意,“locID”列始终存在并且需要返回。所以,我需要这样的东西:

var uploadTable = dataTable.DefaultView.ToTable(false, "locID", "hz%");

有什么想法吗? 谢谢。

【问题讨论】:

  • 你需要选择列是什么意思?您需要选择列名以hz 开头的行吗?还是只需要选择没有数据的DataColumns?
  • 我还需要选择行。即根据列名对数据表进行子集化。

标签: c# linq datatable


【解决方案1】:

我会使用 LINQ 来完成这项任务:

DataTable uploadtable = dataTable.Copy();
var removeColumns = dataTable.Columns.Cast<DataColumn>()
   .Where(c => !c.ColumnName.StartsWith("hz", StringComparison.InvariantCultureIgnoreCase));

foreach (DataColumn colToRemove in removeColumns)
    uploadtable.Columns.Remove(colToRemove.ColumnName);

【讨论】:

  • 谢谢,这正是我所需要的!
【解决方案2】:
 string[] columnNames = dt.Columns.Cast<DataColumn>()
                                         .Select(x => x.ColumnName).Where(n => n.Contains("hz")).ToArray();

    var uploadTable = dataTable.DefaultView.ToTable(false, columnNames);

【讨论】:

  • 您的 linq 不适用于 Machzor 列名?
  • @J.SMTBCJ15 为什么?
  • 因为@azar 他说以不包含开头,如果列名是 Machzor 将被视为实际上不是的列
  • @J.SMTBCJ15 是的,谢谢
猜你喜欢
  • 2021-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-13
  • 2021-09-03
  • 2013-04-15
相关资源
最近更新 更多