.net 应该使用什么属性进行重新排序?

roejwanj  于 2023-01-03  发布在  .NET
关注(0)|答案(1)|浏览(92)

我希望能够使用左侧的箭头更改顺序,并使用右侧的删除按钮删除特定项目。

现在,我已经准备好了删除功能,但是对于如何实现重新排序,我还是有点不知所措。
我的实体如下所示:

public class Account
{
    public Guid Id { get; set; }

    public string[] Property1 { get; set; }

    public string Property2 { get; set; }

    public string Property3 { get; set; }

    public string Property 4{ get; set; }
}

我的第一个想法是使用一个int属性和它后面的order。我可以交换两个int属性当一个箭头被按下时。如果我删除了一个元素它仍然可以工作,如果我添加了一个新元素我必须确保设置它为max int+1。但它似乎非常笨拙,效率不高。有没有更好的方法来实现这样的东西?

bvhaajcl

bvhaajcl1#

添加Order列是最简单的方法。
用于添加:

//get max order
int maxOrder = context.Account.Max(r => r.Order);

var newRow = new Account{ Order = maxOrder + 1 //rest of the properties };
context.Account.Add(newRow);

//Update the rest of the rows
var rows = context.Account.Where(r => r.Order >= newRow.Order).ToList();
foreach (var row in rows)
{
    row.Order++;
}

context.SaveChanges();

用于删除

var rowToDelete = context.Account.FirstOrDefault(r => r.Id == idToDelete);
context.Account.Remove(rowToDelete);

//Update the rest of the rows

var rows = context.Account.Where(r => r.Order > rowToDelete.Order).ToList();
foreach (var row in rows)
{
    row.Order--;
}

context.SaveChanges();

用于重新排序

//get rows between the current order and the new order that you want to assign

var rowsBetween = context.Account.Where(r => r.Order > Math.Min(rowToMove.Order, newOrder) 
                  && r.Order < Math.Max(rowToMove.Order, newOrder)).ToList();

Math.Min(rowToMove.Order, newOrder)Math.Max(rowToMove.Order, newOrder)在这里很重要,因为如果您根据方向上下移动行,则最小值和最大值函数将起作用
其余部分仅更新了rowsBetween中的订单

foreach (var row in rowsBetween)
{
    if (rowToMove.Order < newOrder)
       row.Order--;
    else 
       row.Order++;

}

相关问题