我有一个排序用户界面,用户可以单击列表上的上移或下移按钮来上下移动项目并将新订单存储在数据库中。
排序顺序存储在属性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
答案 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();
这是测试结果:
答案 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