排序算法
原理:#
1 4 = 1 2 1 +1 = 2 3 2 +1 = 3 4 3 +1 = 4 5 5 = 5 prev: null next: 1 newOrder 1 < originOrder 4 >0 && < 4 1 2 -1 = 1 2 3 -1 = 2 3 1 = 3 4 4 = 4 5 5 = 5 prev: 3 next: 4 newOrder 3 > originOrder 1 >1 && <4 1 1 = 1 2 3 -1 = 2 3 4 -1 = 3 4 5 -1 = 4 5 2 = 5 prev: 5 next: null newOrder 5 > originOrder 2 >2 && <6 newOrder > originOrder,中间部分序号-1 newOrder < originOrder,中间部分序号+1
伪代码:#
private async Task SortAsync(Guid id, int? toPreviousOrder, int? toNextOrder) { var newOrder = GetNewOrder(toPreviousOrder, toNextOrder); var entity = await _store.FindAsync(id, required: true); if (entity.Order == newOrder) return; IEnumerable<Entity> entitiesBetween; if (newOrder > entity.Order) { entitiesBetween = await GetEntitiesAsync(x => x.Order > entity.Order && x.Order < newOrder + 1); } else { entitiesBetween = await GetEntitiesAsync(x => x.Order > newOrder - 1 && x.Order < entity.Order); } if (entitiesBetween.Any()) { foreach (var entityBetween in entitiesBetween) { if (newOrder > entity.Order) { entityBetween.Order -= 1; } else { entityBetween.Order += 1; } entityBetween.WhenUpdated = DateTime.Now; } _store.UpdateRange(entitiesBetween); } entity.Order = newOrder; entity.WhenUpdated = DateTime.Now; _store.Update(entity); await _store.SaveChangesAsync(); } private int GetNewOrder(int? toPreviousOrder, int? toNextOrder) { if (toPreviousOrder.HasValue && toNextOrder.HasValue) { return toPreviousId.Value; } else if (toPreviousOrder.HasValue && !toNextOrder.HasValue) { return toPreviousOrder.Value; } else if (!toPreviousOrder.HasValue && toNextOrder.HasValue) { return toNextOrder.Value; } else throw new InvalidOperationException(); }
纠正代码(调用 GetNewOrderId 的地方需要改成调用这个):
public static Guid GetNewOrderId(Guid? toPreviousId, Guid? toNextId, int? toPreviousOrder, int currentOrder) { if (toPreviousId.HasValue && toNextId.HasValue) { if (toPreviousOrder < currentOrder) { return toNextId.Value; } else { return toPreviousId.Value; } } else if (toPreviousId.HasValue && !toNextId.HasValue) { return toPreviousId.Value; } else if (!toPreviousId.HasValue && toNextId.HasValue) { return toNextId.Value; } else throw new InvalidOperationException(); }
分类:
c sharp
【推荐】2025 HarmonyOS 鸿蒙创新赛正式启动,百万大奖等你挑战
【推荐】博客园的心动:当一群程序员决定开源共建一个真诚相亲平台
【推荐】开源 Linux 服务器运维管理面板 1Panel V2 版本正式发布
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 还在手写JSON调教大模型?.NET 9有新玩法
· 复杂业务系统线上问题排查过程
· 通过抓包,深入揭秘MCP协议底层通信
· 记一次.NET MAUI项目中绑定Android库实现硬件控制的开发经历
· 糊涂啊!这个需求居然没想到用时间轮来解决
· Coze Studio:字节跳动 Coze 的开源版本来了!第一时间深度解析
· 一款超级经典复古的 Windows 9x 主题风格 Avalonia UI 控件库,满满的回忆杀!
· 我给 AI 接上了一个 C# 运行器,结果它学会了自己上网、调试代码
· 源码浅析:SpringBoot main方法结束为什么程序不停止
· Qwen Code与Claude Coder Router体验