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

