在foreach循环中统计多字段取值并添加汇总行的技术咨询
解决方案:动态统计表格字段取值总数
针对你有50余个字段的情况,手动逐个编写统计逻辑效率太低,我们可以通过动态收集统计数据的方式来实现需求。下面是具体的实现步骤和代码示例:
1. 初始化统计结构
首先我们需要一个字典来存储每个字段的取值计数,键为字段名,值是另一个字典记录s/n/na的数量:
// 初始化统计容器:字段名 → { 取值: 计数 } var fieldStats = new Dictionary<string, Dictionary<string, int>>(); // 定义需要统计的字段列表(如果能动态获取字段名,这一步可以优化,见下文) var fieldsToCount = new List<string> { "a1", "b1", "b2", "b3" /* 这里补充你的其他50+字段 */ }; // 为每个字段初始化计数 foreach (var field in fieldsToCount) { fieldStats[field] = new Dictionary<string, int> { {"s", 0}, {"n", 0}, {"na", 0} }; }
2. 遍历数据时同步更新统计
在你原来的遍历代码中,除了生成表格行,我们同时更新每个字段的计数:
var mydynlist = AsDynamic(App.Data["mydynlistsource"]); foreach (var q in mydynlist) { // 同步更新当前行所有字段的统计数据 foreach (var field in fieldsToCount) { // 确保取值统一(比如转小写,避免大小写不一致导致统计错误) var value = q[field].ToString().ToLower(); // 如果取值在统计范围内,就累加计数 if (fieldStats[field].ContainsKey(value)) { fieldStats[field][value]++; } } // 你原来的表格行生成逻辑 <tr> <td>@q.a1</td> <td>@q.b1</td> <td>@q.b2</td> <td>@q.b3</td> <!-- 其他字段的<td> --> </tr> }
3. 生成统计行
遍历统计好的数据,生成最后一行统计结果:
<!-- 统计结果行 --> <tr> @foreach (var field in fieldsToCount) { <td> s: @fieldStats[field]["s"], n: @fieldStats[field]["n"], na: @fieldStats[field]["na"] </td> } </tr>
优化:动态获取字段名(无需手动列字段)
如果你的动态对象的字段名可以通过反射获取,那我们可以省去手动编写fieldsToCount的步骤,自动获取所有字段:
var mydynlist = AsDynamic(App.Data["mydynlistsource"]); var firstItem = mydynlist.FirstOrDefault(); if (firstItem != null) { // 通过反射获取动态对象的所有属性名(即你的字段名) var fieldsToCount = firstItem.GetType().GetProperties().Select(p => p.Name).ToList(); // 初始化统计容器 foreach (var field in fieldsToCount) { fieldStats[field] = new Dictionary<string, int> { {"s", 0}, {"n", 0}, {"na", 0} }; } }
这样不管有多少个字段,都能自动完成统计,不用手动维护字段列表。
内容的提问来源于stack exchange,提问作者João Gomes
相关产品推荐
相关产品推荐

