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
相关产品推荐
相关产品推荐

