如何将已按字母排序的列表输出为多列,维持排序且截断末行
有序字符串列表转末行截断式多列表格
我有一个已按字母顺序排序的List<string>集合,需要将其输出为多列表格,要求每列维持字母排序,剩余元素顺延至下一列。
之前尝试用公式 var rows = (int)Math.Ceiling(data.Count() / columns); 计算行数,但这种方式会先填满每列的最大行数,导致最后一列元素数量偏少。我需要实现的是最后一行被截断的效果。
最终找到的可行解决方案代码如下:
string[,]? GetResult(List<string> input, int numColumns) { if (input == null) return null; if (numColumns < 1) numColumns = 1; double rowsRemainder = input.Count / (numColumns*1.0); int remainder = input.Count % numColumns; int numRows = (int)Math.Ceiling(rowsRemainder); string[,] result = new string[numRows, numColumns]; int inputIndex = 0; for (int col = 0; col < numColumns; col++) { for (int row = 0; row < numRows; row++) { if (row == (numRows-1) && col >= remainder) continue; result[row, col] = input[inputIndex]; inputIndex++; } } var padLength = input.Max(x => x.Length) + 2; OutputValue(result, padLength); return result; }
关键逻辑说明
- 通过
Math.Ceiling(input.Count / (numColumns*1.0))计算总行数,确保元素能按列均匀分布(前remainder列会比其他列多一行元素) - 利用
input.Count % numColumns得到余数,用来标记哪些列需要填充最后一行的元素 - 采用先列后行的遍历顺序,保证每列内的元素维持原有的字母排序
- 当遍历到最后一行且列索引大于等于余数时,跳过填充操作,实现末行截断的效果
内容的提问来源于stack exchange,提问作者danewfie
相关产品推荐
相关产品推荐

