有没有比这更简单的方法来上下移动列表中的项目?

时间:2020-07-08 04:41:39

标签: c# asp.net-core-mvc

我有一个排序用户界面,用户可以单击列表上的上移或下移按钮来上下移动项目并将新订单存储在数据库中。

排序顺序存储在属性SortOrder上,其范围从1(顶部)到列表中的项目数(底部)。

这是我目前用于排序的代码:

List<Item> items = await db.Items.ToListAsync();
Item item = items.Where(i => i.Id == id).FirstOrDefault();
if (direction == "up" && item.SortOrder > 1)
{
    Item itemAbove = items.Where(i => i.SortOrder == item.SortOrder - 1).FirstOrDefault();
    item.SortOrder--;
    itemAbove.SortOrder++;
    db.Update(item);
    db.Update(itemAbove);
}
if (direction == "down" && item.SortOrder < items.Count)
{
    Item itemBelow = items.Where(r => r.SortOrder == item.SortOrder + 1).FirstOrDefault();
    item.SortOrder++;
    itemBelow.SortOrder--;
    db.Update(item);
    db.Update(itemBelow);
}
await db.SaveChangesAsync();

// redirect to the list view

我对C#还是很陌生,所以我想知道在List<T>上是否可以使用任何方便的排序方法。也许像

items.MoveUp(i => i.SortOrder == 4); // swaps items #3 and #4

2 个答案:

答案 0 :(得分:1)

更新

如果您只是想简化代码,而需要同时更新多个数据,则可以使用 UpdateRange

按如下所示简化代码:

            List<Item> items = await db.Items.ToListAsync();
            Item item = items.Where(i => i.Id == id).FirstOrDefault();
            if (direction == "up" && item.SortOrder > 1)
            {
                items.Where(i => i.SortOrder == item.SortOrder - 1).FirstOrDefault().SortOrder++;
                item.SortOrder--; 
            }
            if (direction == "down" && item.SortOrder < items.Count)
            {
                items.Where(i => i.SortOrder == item.SortOrder + 1).FirstOrDefault().SortOrder--;
                item.SortOrder++; 
            }
            db.Items.UpdateRange(items);
            await db.SaveChangesAsync(); 

这是测试结果:

enter image description here

答案 1 :(得分:0)

如果您不介意对条件进行硬编码,则可以使用OrderBy。

        public class Entry
        {
            public Entry(int sortOrder)
            {
                this.sortOrder = sortOrder;
            }

            public int sortOrder;

        }

            List<Entry> ents = new List<Entry>();

            for (int i = 0; i < 10; i++)
            {
                ents.Add(new Entry(i));
            }

            ents = ents.OrderBy((x) =>
            {
                if (x.sortOrder == 1)
                    return 5;
                else if (x.sortOrder == 5)
                    return 1;
                else
                    return x.sortOrder;
             }).ToList();

            Debugger.Log(0, "cat", "\r\n" +string.Join(", ", ents.Select(x => x.sortOrder.ToString()).ToArray()) + "\r\n");

输出:

0、5、2、3、4、1、6、7、8、9