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

C# WinForms中GridView分组:如何获取codeScheme与code首个值

C# .NET桌面应用GridView分组问题

原始GridView数据

ibengin   iend   code    preferredText     Affirmation    tag     codeScheme    Value
1         10             Kitkat            Yes            Choc    
11        15             Mars              Yes            Choc    
16        20             Bounty            Yes            Choc    
21        27     A1      Kitkat            Yes            Choc    USA
28        32             Bounty            Yes            Choc    
33        47             Bounty            No             Choc    
48        61     A1      Kitkat            Yes            Choc    USA
62        65     B7      Mars              Yes            Choc    UK
66        77             Kitkat            Yes            Choc    USA
78        81             Kitkat            Yes            Choc    

期望分组结果

Affirmation   PreferredText   Count    Value   CodingScheme   Code    Positions
Yes           Kitkat          5                USA            A1     1:10,21:27,48:61,66:77,78:81
Yes           Mars            2                UK             B7     11:15,62:65
Yes           Bounty          2                                      16:20,28:32
No            Bounty          1                                      33:47

现有代码

var lstInfo = grdBreakDown.Rows.Cast<DataGridViewRow>()
                           .Where(x => !x.IsNewRow)                   
                           .Where(x => x.Cells["Tag"].Value.ToString() == Tag)
                           .GroupBy(x => new
                           {
                               grpAffirmation = x.Cells["Affirmation"].Value.ToString(),
                               grpPreferredText = x.Cells["preferredText"].Value.ToString(),
                               grpValue = (cbxValue.Checked ? x.Cells["Value"].Value.ToString() : "")
                           })
                           .Select(y => new
                           {
                               Affirmation = y.Key.grpAffirmation,
                               PreferredText = y.Key.grpPreferredText,
                               Count = y.Count(),
                               Value = y.Key.grpValue,
                               Positions = string.Join(",", y.Select(i => i.Cells["ibegin"].Value.ToString() + ":" + i.Cells["iend"].Value.ToString()))
                           })
                           .OrderByDescending(y => y.Count)
                           .ToList();

修改方案

要获取每组中code和codeScheme的第一个非空值,只需在Select的匿名类中添加两个属性,通过筛选组内元素取第一个非空值即可:

var lstInfo = grdBreakDown.Rows.Cast<DataGridViewRow>()
                           .Where(x => !x.IsNewRow)                   
                           .Where(x => x.Cells["Tag"].Value.ToString() == Tag)
                           .GroupBy(x => new
                           {
                               grpAffirmation = x.Cells["Affirmation"].Value.ToString(),
                               grpPreferredText = x.Cells["preferredText"].Value.ToString(),
                               grpValue = (cbxValue.Checked ? x.Cells["Value"].Value.ToString() : "")
                           })
                           .Select(y => new
                           {
                               Affirmation = y.Key.grpAffirmation,
                               PreferredText = y.Key.grpPreferredText,
                               Count = y.Count(),
                               Value = y.Key.grpValue,
                               // 取组内第一个非空的code值
                               Code = y.Select(i => i.Cells["code"].Value?.ToString())
                                       .FirstOrDefault(s => !string.IsNullOrEmpty(s)) ?? "",
                               // 取组内第一个非空的codeScheme值
                               CodingScheme = y.Select(i => i.Cells["codeScheme"].Value?.ToString())
                                               .FirstOrDefault(s => !string.IsNullOrEmpty(s)) ?? "",
                               Positions = string.Join(",", y.Select(i => i.Cells["ibegin"].Value.ToString() + ":" + i.Cells["iend"].Value.ToString()))
                           })
                           .OrderByDescending(y => y.Count)
                           .ToList();

说明

  • 使用y.Select(...)提取组内所有行的code/codeScheme值,通过FirstOrDefault(s => !string.IsNullOrEmpty(s))筛选出第一个非空值;
  • 用?? ""处理组内所有值都为空的情况,确保返回空字符串而非null。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 21:15:39