C#集合按Level统计对象数并格式化输出至列表框/文本框
解决方案
实现要点
- 用LINQ的
GroupBy按Level分组,同时按层级升序排序 - 借助字符串固定宽度占位符实现列对齐,避免内容错位
- 将生成的文本批量输出到ListBox或TextBox控件
完整代码示例
// 先确保Galaxy类已定义 public class Galaxy { public string Name { get; set; } public int MegaLightYears { get; set; } public int Level { get; set; } } // 核心处理逻辑 var theGalaxies = new List<Galaxy> { new Galaxy() { Name="Tadpole", MegaLightYears=400, Level=1}, new Galaxy() { Name="Pinwheel", MegaLightYears=25, Level=1}, new Galaxy() { Name="Milky Way", MegaLightYears=0, Level=2}, new Galaxy() { Name="Andromeda", MegaLightYears=3, Level=3} }; // 按Level分组并按层级排序 var groupedGalaxies = theGalaxies.GroupBy(g => g.Level) .OrderBy(g => g.Key); // 构建输出内容集合 var outputLines = new List<string>(); // 添加格式化表头 outputLines.Add(string.Format("{0,-12}{1,-18}{2}", "Name", "MegaLightYears", "Level")); foreach (var group in groupedGalaxies) { // 输出当前层级的所有星系 foreach (var galaxy in group) { outputLines.Add(string.Format("{0,-12}{1,-18}{2}", galaxy.Name, galaxy.MegaLightYears, galaxy.Level)); } // 输出层级统计结果 var countDesc = group.Count() == 1 ? "1 galaxy" : $"{group.Count()} galaxies"; outputLines.Add($"{countDesc} in Level {group.Key}"); } // 输出到ListBox(需确保控件已在窗体中定义) listBox1.Items.AddRange(outputLines.ToArray()); // 如果输出到TextBox,需先设置Multiline属性为true // textBox1.Lines = outputLines.ToArray();
关键细节说明
- 分组排序:
GroupBy(g => g.Level)完成层级分组,OrderBy(g => g.Key)保证层级按数字从小到大展示 - 对齐处理:
{0,-12}这类格式符表示左对齐且占用12个字符宽度,不同长度的内容会自动补空格,避免错位 - 控件输出:ListBox用
AddRange批量添加效率更高;TextBox必须开启多行模式才能完整显示所有内容
内容的提问来源于stack exchange,提问作者user2575580
相关产品推荐
相关产品推荐

