我需要一个算法来重新排序列表。
以下是列表和用例
Code:
class Items
{
public string Name { get; set; }
public int index { get; set; }
}
List<Items> temp = new List<Items>();
temp.Add(new Items() { index = 1, Name = "manchester" });
temp.Add(new Items() { index = 2, Name = "Delhi" });
temp.Add(new Items() { index = 3, Name = "madrid" });
temp.Add(new Items() { index = 4, Name = "London" });
temp.Add(new Items() { index = 5, Name = "Ajax" });
用例:
用户来手动重新排序(索引值)上面的列表
List<Items> newOrder = new List<Items>();
newOrder.Add(new Items() { index = 1, Name = "manchester" });
newOrder.Add(new Items() { index = 1, Name = "Delhi" });
newOrder.Add(new Items() { index = 5, Name = "madrid" });
newOrder.Add(new Items() { index = 3, Name = "London" });
newOrder.Add(new Items() { index = 2, Name = "Ajax" });
处理后预期输出应为
List<Items> newOrder = new List<Items>();
newOrder.Add(new Items() { index = 1, Name = "Delhi" });
newOrder.Add(new Items() { index = 1, Name = "Ajax" });
newOrder.Add(new Items() { index = 5, Name = "London" });
newOrder.Add(new Items() { index = 3, Name = "manchester" });
newOrder.Add(new Items() { index = 2, Name = "madrid" });
请建议生成输出的算法,如“预期输出部分”
答案 0 :(得分:1)
我使用的一个解决方案是存储索引值和上次设置的日期时间。
class Priority
{
private int _index;
private DateTime _updated;
public int Index
{
get { return _index; }
set
{
_index = value;
_updated = DateTime.Now;
}
}
public DateTime Updated { get { return _updated; } }
}
然后可以使用:
// extension method for supporting sorting
public IEnumerable<Item> SortByPriority(this IEnumerable<Item> source)
{
return source.OrderBy(x => x.Priority.Value).ThenByDescending(x => x.Priority.Updated);
}
当然更新了
// method for updating priority of a item
public void UpdatePriority(List<Item> items, Item target, Item before)
{
if (before == null)
{
// append to the end
target.Priority.Value = items.Max(x => x.Priority.Value) + 1;
}
else
{
target.Priority.Value = before.Priority.Value;
}
}
这种机制可以很容易地集成到关系数据库中。不幸的是,它并不完美。当您在一个方法中设置多个项目的优先级时,很可能DateTime.Now将返回相同的值,这可能会弄乱您的排序顺序。如果是这种情况,您可以使用auto-inc更新序列号而不是datetime
答案 1 :(得分:0)
如果您既可以存储旧索引又可以存储新用户选择的索引,那么多个&quot; orderby应该可以正常工作。这将首先按新索引排序,但对于用户已提供多个项目的任何实例,相同的索引将通过按原始订单排序来解决冲突