【问题标题】:Inserting into a C# List of Objects that uses a Property of the Object to Sort插入使用对象的属性进行排序的 C# 对象列表
【发布时间】:2012-06-27 18:27:43
【问题描述】:

有一个对象列表,每个对象代表数据库中的一条记录。要对记录进行排序,有一个名为 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。有什么想法吗?

【问题讨论】:

  • for 循环有什么问题?也许我误解了这个问题。
  • 所以当您更改一个 groupInfo 的排序顺序时,它会更改其他 groupinfos 的排序顺序?
  • 用linq轻松搞定,等老婆下电脑一分钟发例子!
  • 你老婆得快点了。 ;-)
  • SortOrder是否需要保留在GroupInfo对象中,SortOrder是由什么决定的?就个人而言,我会认真考虑使用例如SortedList&lt;int, GroupInfo&gt; 来解决这个问题。更新SortOrder 仍然需要一些逻辑,但您至少可以消除GroupInfo 对象的一些复杂性。

标签: c# list sorting object orm


【解决方案1】:

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

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

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

【讨论】:

  • 这样做的问题是您会将列表传递给该列表中包含的对象的方法。我宁愿在 GroupInfo 之外定义这个方法。您可以将其作为当前范围内的辅助方法,也可以从 List 继承并将其作为方法包含在您的集合中。
【解决方案2】:
var sortedList = list.OrderBy(item => item.SortOrder);

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-05
    相关资源
    最近更新 更多