含重复值列表排名跳号问题:C#代码修正求助
解决方案
你的代码问题在于先给每个元素分配了连续序号(1+i),再通过分组取最小序号作为排名,这会导致重复值占用多个序号位置,后续元素的排名直接跳过这些位置,出现跳号。要实现重复值同排名、后续排名连续的需求,应该按值分组后给每个组分配排名,而非基于单个元素的初始序号。
修改后的代码
var rankedList = oList .OrderByDescending(p => p.QTECDE) // 先按QTECDE降序排序,确保相同值的元素相邻 .GroupBy(p => p.QTECDE) // 按QTECDE分组,组的顺序保持排序后的降序 .Select((group, groupIndex) => new { Rank = groupIndex + 1, // 给每个组分配连续排名(组索引从0开始,+1转为从1开始) Items = group }) .SelectMany(g => g.Items.Select(item => new { RANK = g.Rank, NO_ART = item.NO_ART, QTECDE = item.QTECDE, LIB_INDEX_FR_SUP = item.LIB_NIVEAU_SUP_FR, LIB_IMAGE = item.LIB_IMAGE // 修正原代码中可能的笔误,确保取元素自身的LIB_IMAGE }));
逻辑说明
- 排序分组:先对原列表按
QTECDE降序排序,保证相同值的元素集中在一起,再按QTECDE分组,组的顺序就是值从大到小的顺序。 - 组级排名:通过
Select((group, groupIndex))给每个组分配排名,groupIndex+1确保排名从1开始且连续,不管每个组包含多少元素。 - 展开元素:用
SelectMany将每个组的元素展开,每个元素都继承所在组的排名,实现重复值同排名、后续排名无跳号的效果。
内容的提问来源于stack exchange,提问作者Siwar Hadj Ali
相关产品推荐
相关产品推荐

