1

有一个对象列表,每个对象代表数据库中的一条记录。要对记录进行排序,有一个名为 SortOrder 的属性。这是一个示例对象:

public class GroupInfo
{
    public int Id { get; set; }
    public string Text { get; set; }
    public int SortOrder { get; set; }

        public GroupInfo()
        {
            Id = 0;
            Text = string.Empty;
            SortOrder = 1;
        }
}

列表对象如下所示:

var list = new List<GroupInfo>();

我需要能够更改 SortOrder 并更新列表中其他对象的 SortOrder。我想出了如何按一个向上或向下排序。我需要知道如何将其更改多个并调整其他记录上的 SortOrder。有任何想法吗?

4

2 回答 2

1

这可以通过首先获取原始SortOrder和更新的SortOrder. 然后,您将遍历您的集合并调整 和之间范围内SortOrder的任何其他对象的。您可以将所有这些放在包含集合的“SetSortOrder”函数中。GroupInfooriginalupdated

public static void SetSortOrder(List<GroupInfo> groupInfos, GroupInfo target, int newSortOrder)
{
    if (newSortOrder == target.SortOrder)
    {
        return; // No change
    }
    // If newSortOrder > SortOrder, shift all GroupInfos in that range down
    // Otherwise, shift them up
    int sortOrderAdjustment = (newSortOrder > target.SortOrder ? -1 : 1);
    // Get the range of SortOrders that must be updated
    int bottom = Math.Min(newSortOrder, target.SortOrder);
    int top = Math.Max(newSortOrder, target.SortOrder);
    // Get the GroupInfos that fall within our range
    var groupInfosToUpdate = from g in groupInfos
                                where g.Id != target.Id
                                && g.SortOrder >= bottom
                                && g.SortOrder <= top
                                select g;
    // Do the updates
    foreach (GroupInfo g in groupInfosToUpdate)
    {
        g.SortOrder += sortOrderAdjustment;
    }

    target.SortOrder = newSortOrder;
    // Uncomment this if you want the list to resort every time you update
    // one of its members (not a good idea if you're doing bulk changes)
    //groupInfos.Sort((info1, info2) => info1.SortOrder.CompareTo(info2.SortOrder));
}

更新:按照建议,我将逻辑移到了静态辅助函数中。

于 2012-06-27T18:51:42.290 回答
0
var sortedList = list.OrderBy(item => item.SortOrder);

编辑:对不起,我误会了。您需要自己编写一个方法GroupInfo来处理该属性的更新。

于 2012-06-27T18:34:17.563 回答