Loading

排序算法

原理:#

复制代码
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();
        }
复制代码

 

posted @   myEsn2E9  阅读(193)  评论(0)    收藏  举报
编辑推荐:
· 还在手写JSON调教大模型?.NET 9有新玩法
· 复杂业务系统线上问题排查过程
· 通过抓包,深入揭秘MCP协议底层通信
· 记一次.NET MAUI项目中绑定Android库实现硬件控制的开发经历
· 糊涂啊!这个需求居然没想到用时间轮来解决
阅读排行:
· Coze Studio:字节跳动 Coze 的开源版本来了!第一时间深度解析
· 一款超级经典复古的 Windows 9x 主题风格 Avalonia UI 控件库,满满的回忆杀!
· 我给 AI 接上了一个 C# 运行器,结果它学会了自己上网、调试代码
· 源码浅析:SpringBoot main方法结束为什么程序不停止
· Qwen Code与Claude Coder Router体验
点击右上角即可分享
微信分享提示
主题色彩