如何将GridView列的值传入List<>并进行排序排名?
如何将GridView列的值传入List<>并进行排序排名?
嘿,我看你现在想要把GridView指定列的数值提取到List<double>里,然后完成排序和排名的操作,你的思路方向是对的,但可以调整得更简洁、更健壮一些,我来给你梳理下优化后的实现方式~
首先,先说说你原来的写法:每次循环创建一个只包含单个元素的double[]数组,再通过AddRange加到列表里,其实完全没必要这么绕,直接把每个转换后的数值添加到列表里就好,而且最好加上数值转换的异常处理,避免遇到非数字文本时程序报错。
下面是优化后的完整代码示例:
// 初始化存储数值的列表 var numList = new List<double>(); // 遍历GridView的每一行 foreach (GridViewRow row in GridView1.Rows) { // 先判断当前行是不是数据行,跳过表头、空行这类非数据行 if (row.RowType == DataControlRowType.DataRow) { // 尝试将单元格文本转换为double类型,避免转换失败抛出异常 if (double.TryParse(row.Cells[1].Text, out double cellValue)) { // 转换成功就添加到列表里 numList.Add(cellValue); } else { // 这里可以处理转换失败的情况,比如打印日志或者给用户提示 // 示例:Console.WriteLine($"无法转换单元格值:{row.Cells[1].Text}"); } } } // 对列表进行升序排序(如果要降序可以用numList.Sort((a,b) => b.CompareTo(a))) numList.Sort(); // 排序后就可以根据索引做排名了,比如: for (int i = 0; i < numList.Count; i++) { // 默认升序的话,索引0是第1名,索引1是第2名,以此类推 Console.WriteLine($"数值:{numList[i]},排名:{i + 1}"); }
几点说明:
- 加入了
row.RowType的判断,确保我们只处理真正的数据行,不会误处理表头或者分页行这类特殊行; - 用
double.TryParse替代Convert.ToDouble,这样遇到无法转换的文本时,程序不会直接崩溃,还能自定义处理逻辑; - 排序默认是升序,如果需要降序排序,可以改成
numList.Sort((a, b) => b.CompareTo(a)); - 关于排名:如果你的场景里有重复数值需要处理并列排名(比如两个相同数值都是第2名,下一个是第4名),那还需要额外的逻辑来处理,比如遍历排序后的列表,记录前一个数值和当前排名,遇到相同值时保持排名不变。
备注:内容来源于stack exchange,提问作者user20465780
相关产品推荐
相关产品推荐

