You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何按非精确列名(Value+日期)遍历DataTable并获取单元格值

解决方法

首先得说明下:DataRow的索引器并不支持直接用通配符(比如Value%)来取值,所以我们得先从Test_DT的列集合里筛选出符合前缀规则的列,之后再遍历每行获取对应单元格的值。

步骤1:定位目标列

我们可以通过列名的前缀匹配(比如以Value @开头)来找到目标列。这里用LINQ会比较简洁,也可以用循环遍历列集合:

// 筛选出列名以"Value @"开头的列(如果只需要第一个匹配的列,用FirstOrDefault;要所有匹配的就用Where)
var targetColumn = Test_DT.Columns.Cast<DataColumn>()
    .FirstOrDefault(col => col.ColumnName.StartsWith("Value @"));

if (targetColumn == null)
{
    // 没找到符合条件的列,这里可以加异常处理或者提示逻辑
    Console.WriteLine("未找到以'Value @'开头的目标列");
    return;
}

步骤2:遍历每行取值

找到目标列后,就可以逐行获取对应单元格的值了:

foreach (DataRow row in Test_DT.Rows)
{
    // 直接用找到的列对象取值,避免列名拼写出错的问题
    var cellValue = row[targetColumn];
    
    // 这里可以根据需求对cellValue做后续处理,比如转换类型、打印输出等
    Console.WriteLine($"当前行的目标单元格值:{cellValue}");
}

处理多匹配列的情况

如果你的Test_DT里可能存在多个以Value @开头的列(比如不同日期的同类型列),可以遍历所有符合条件的列再逐行取值:

var targetColumns = Test_DT.Columns.Cast<DataColumn>()
    .Where(col => col.ColumnName.StartsWith("Value @"))
    .ToList();

foreach (var col in targetColumns)
{
    Console.WriteLine($"正在处理列:{col.ColumnName}");
    foreach (DataRow row in Test_DT.Rows)
    {
        var cellValue = row[col];
        Console.WriteLine($"第{row.Table.Rows.IndexOf(row)+1}行的值:{cellValue}");
    }
}

关于正则匹配的问题

如果之前尝试正则没成功,大概率是表达式写得不够精准。比如要严格匹配Value @MM/DD/YYYY格式的列名,可以用下面的正则来筛选:

using System.Text.RegularExpressions;

// 匹配"Value @"开头,后面跟MM/DD/YYYY格式日期的列名
var columnRegex = new Regex(@"^Value @\d{2}/\d{2}/\d{4}$");
var targetColumn = Test_DT.Columns.Cast<DataColumn>()
    .FirstOrDefault(col => columnRegex.IsMatch(col.ColumnName));

这样就能精准定位到符合格式的列了。


内容的提问来源于stack exchange,提问作者Shantanu Khaladkar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 05:28:13