C#按字符串数组第二个元素数值排序List及输出异常问题
解决排序与输出问题:让结果符合预期且可读
看起来你碰到了两个小问题:排序逻辑没达到预期,以及直接输出集合只显示了类型名称。我们逐个解决:
1. 修正排序逻辑,让"234"排在末尾
你现在用OrderBy(f => f[1])是按字符串来排序的,而字符串比较是按字符逐个对比的——比如"234"和"35",第一个字符'2'比'3'小,所以"234"会排在"35"前面,这和你的期望相反。
要按数值大小排序,得把f[1]转换成整数再比较:
var result = l.OrderBy(f => int.Parse(f[1])).ToList();
如果f[1]可能存在非数字的情况(比如空字符串、字母),建议用int.TryParse避免抛出异常,把无法转换的项放到最后:
var result = l.OrderBy(f => { int.TryParse(f[1], out int num); return num; }).ToList();
2. 正确输出排序后的内容
直接MessageBox.Show($"{result}")会调用List<string[]>的默认ToString()方法,它只会返回类型的全称,不会遍历显示集合里的内容。你需要把每个数组的元素拼接成可读的字符串,再把所有项合并:
比如生成每行一个条目,清晰展示ID和数值:
var output = string.Join(Environment.NewLine, result.Select(arr => $"ID: {arr[0]}, 数值: {arr[1]}")); MessageBox.Show(output);
如果想要更简洁的格式,也可以用逗号分隔每个数组的元素:
var output = string.Join(Environment.NewLine, result.Select(arr => string.Join(", ", arr))); MessageBox.Show(output);
完整可运行代码
把两个部分结合起来,完整代码如下:
var l = new List<string[]>() { new string[] { "10945730333", "5"}, new string[] { "298543022", "234"}, new string[] { "382958320", "35"}, }; // 按数值从低到高排序 var result = l.OrderBy(f => int.Parse(f[1])).ToList(); // 生成可读的输出文本 var output = string.Join(Environment.NewLine, result.Select(arr => $"ID: {arr[0]}, 数值: {arr[1]}")); // 弹出显示结果 MessageBox.Show(output);
运行后,你会看到符合预期的排序结果:
ID: 10945730333, 数值: 5
ID: 382958320, 数值: 35
ID: 298543022, 数值: 234
内容的提问来源于stack exchange,提问作者Ice
相关产品推荐
相关产品推荐

