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

C#中如何遍历列表获取指定列的行值?技术求助

嘿,我看你现在的代码问题出在——你用Select(k => item.Key)的时候,其实只是把列名字符串重复了N次,根本没拿到对应行的实际值对吧?咱们一步步来改,先理清楚逻辑:你要遍历ctsDB的每一行,然后根据指定的列名(比如Field612)取出该行对应列的值,最后把这些值收集起来。

先说说你原代码的核心问题

  • 内层循环里的mooe.Files66.Select(k =>item.Key)是对整个Files66集合操作,而且直接返回列名字符串,不是当前行的列值。
  • ctsfieldsValue.ToList()这行完全没用,只是转成列表但没做任何存储操作。
  • 你的ctsfieldsValue定义成Dictionary<string, string>,但要存多行的列值的话,应该用Dictionary<string, List<string>>,不然只能存单个值。

解决思路和修改后的代码

首先得明确ctsDB里的元素是什么类型:是数据库的DataRow,还是自定义的实体类?我分两种常见情况给你代码:

情况1:ctsDB的元素是DataRow(比如从DataTable里来的)

这种情况可以直接通过列名索引取值:

var ctsDB = mooe.Files66.ToList();
// 假设这个字典是「你要存的键名 => 要提取的列名」的映射,比如{"MyField612", "Field612"}
Dictionary<string, string> mappedfields = new Dictionary<string, string>();
// 改成字典存列表,每个键对应一列的所有行值
Dictionary<string, List<string>> ctsfieldsValue = new Dictionary<string, List<string>>();

// 先给每个要提取的列初始化空列表,避免后续添加报错
foreach (var item in mappedfields)
{
    ctsfieldsValue[item.Key] = new List<string>();
}

// 遍历每一行
foreach (var row in ctsDB)
{
    foreach (var item in mappedfields)
    {
        // 取出当前行对应列的值,转成字符串(处理null情况)
        var columnValue = row[item.Value]?.ToString() ?? string.Empty;
        // 把值添加到对应列的列表里
        ctsfieldsValue[item.Key].Add(columnValue);
    }
}

情况2:ctsDB的元素是自定义实体类(比如有FileID、Field612、Field613属性)

这种情况需要用反射来根据属性名取值:

using System.Reflection;

var ctsDB = mooe.Files66.ToList();
Dictionary<string, string> mappedfields = new Dictionary<string, string>();
Dictionary<string, List<string>> ctsfieldsValue = new Dictionary<string, List<string>>();

// 初始化列表
foreach (var item in mappedfields)
{
    ctsfieldsValue[item.Key] = new List<string>();
}

foreach (var row in ctsDB)
{
    foreach (var item in mappedfields)
    {
        // 获取对应的属性信息
        PropertyInfo prop = row.GetType().GetProperty(item.Value);
        if (prop != null)
        {
            // 取出属性值并转成字符串
            var value = prop.GetValue(row)?.ToString() ?? string.Empty;
            ctsfieldsValue[item.Key].Add(value);
        }
        else
        {
            // 如果属性不存在,添加空字符串或者根据需求处理错误
            ctsfieldsValue[item.Key].Add(string.Empty);
        }
    }
}

如果只是单独提取某一列(比如Field612)的所有值

那可以更简化,不用嵌套循环:

// 直接提取所有行的Field612列值
List<string> field612Values = ctsDB.Select(row => row["Field612"]?.ToString() ?? string.Empty).ToList();

内容的提问来源于stack exchange,提问作者Yasmeena Abs

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:37:54