C# DataTable按RANK列重排序算法实现求助
C# DataTable 按RANK列重排序实现方案
核心逻辑是根据目标行的新旧RANK值,调整其他行的RANK以保持连续序列,最后按RANK排序表格:
RANK调整规则:
- 若新RANK大于旧RANK:将旧RANK+1到新RANK之间的所有行的RANK值减1,给目标行腾出位置
- 若新RANK小于旧RANK:将新RANK到旧RANK-1之间的所有行的RANK值加1,为目标行让位
代码实现:
public DataTable ReorderDataTableByRank(DataTable originalTable, int oldRank, int newRank, string rankColumn = "RANK") { // 复制原表格,避免修改原始数据 DataTable newTable = originalTable.Copy(); newTable.AcceptChanges(); // 获取要修改的目标行 DataRow targetRow = newTable.AsEnumerable() .FirstOrDefault(row => row.Field<int>(rankColumn) == oldRank); if (targetRow == null) return newTable; // 调整其他行的RANK值 if (newRank > oldRank) { // 旧RANK+1 到 新RANK 之间的行,RANK减1 foreach (DataRow row in newTable.AsEnumerable() .Where(r => r.Field<int>(rankColumn) > oldRank && r.Field<int>(rankColumn) <= newRank)) { row.SetField(rankColumn, row.Field<int>(rankColumn) - 1); } } else if (newRank < oldRank) { // 新RANK 到 旧RANK-1 之间的行,RANK加1 foreach (DataRow row in newTable.AsEnumerable() .Where(r => r.Field<int>(rankColumn) >= newRank && r.Field<int>(rankColumn) < oldRank)) { row.SetField(rankColumn, row.Field<int>(rankColumn) + 1); } } // 新旧RANK相同,无需调整 else { return newTable; } // 设置目标行的新RANK targetRow.SetField(rankColumn, newRank); // 按RANK列重新排序 newTable.DefaultView.Sort = $"{rankColumn} ASC"; DataTable sortedTable = newTable.DefaultView.ToTable(); return sortedTable; }
- 验证示例:
- 初始表格:
1 A 2 B 3 C 4 D 5 E
- 调用
ReorderDataTableByRank(originalTable, 3, 5)后,输出:
1 A 2 B 3 D 4 E 5 C
- 调用
ReorderDataTableByRank(originalTable, 3, 2)后,输出:
1 A 2 C 3 B 4 D 5 E
内容的提问来源于stack exchange,提问作者NoBullMan
相关产品推荐
相关产品推荐

