重新排序列表,如netflix

时间:2011-11-07 08:55:48

标签: c#

我需要一个算法来重新排序列表。

以下是列表和用例

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" });

请建议生成输出的算法,如“预期输出部分”

2 个答案:

答案 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应该可以正常工作。这将首先按新索引排序,但对于用户已提供多个项目的任何实例,相同的索引将通过按原始订单排序来解决冲突