如何为一个List <mystructure>保留多个排序顺序

时间:2016-05-17 08:19:02

标签: c# .net sorting optimization

我有一个作为类实现的自定义结构,因为我需要为单个客户提供单个实例。它有很多字段,比方说5个字段:

public class SCustomer
{
    public Guid ID;
    public int PriorityIndex;
    public string Name;
    public DateTime BirthDate;
    public double Rating;
}

在我的业务逻辑中,我经常需要使用不同的比较策略对这些结构的列表进行排序,即List<SCustomer>,有些是实现者作为实例比较器,有些是匿名代表。

由于性能原因,每次需要新订单时对单个List进行排序不是一种选择。维护尽可能多的列表和我需要的排序顺序很麻烦,即我需要保持它们同步,因为列表有定期(不频繁)更新,更新是批量更新。

在.NET中为一组关系数据维护多个排序顺序的建议策略是什么?

供参考:清单大小约为10万个。每1000个阅读场景周期更新率约为1次更新。更新触及大约10%的记录。

2 个答案:

答案 0 :(得分:1)

  

维护尽可能多的列表和我需要的排序顺序很麻烦,即我需要保持它们同步,因为列表有定期(不频繁)更新,更新是批量更新。

你可以创建一个父列表,在内部保存尽可能多的列表,因为排序顺序是nedded。父列表可以使用其不同的排序顺序(可以作为只读列表)公开内部列表。因此,您只有一个界面来管理您的项目,您可以随时按排序顺序访问它们。

注意:所有列表共享相同的项目,因此该解决方案所需的内存消耗不多。

答案 1 :(得分:1)

您可以为每种排序方式使用索引列表。索引列表占用的内存空间更少,因为它们只是整数。例如:

public class SCustomer
{
    public SCustomer(int ID, string Name)
    {
        this.ID = ID;
        this.Name = Name;
    }
    public int ID;
    public string Name;
}

public static void Main (string[] args)
{
    List<SCustomer> people = new List<SCustomer>();
    SCustomer customer1 = new SCustomer (11, "Robert");
    SCustomer customer2 = new SCustomer (5, "Kate");
    SCustomer customer3 = new SCustomer (23, "David");
    people.Add(customer1);
    people.Add(customer2);
    people.Add(customer3);

    List<int> sortingById = new List<int>();
    List<int> sortingByName = new List<int>();
    for(int i=0; i<people.Count; i++)
    {
        sortingById.Add(i);
        sortingByName.Add(i);
    }

    sortingById.Sort( (e1, e2) => people[e1].ID.CompareTo(people[e2].ID) );
    sortingByName.Sort( (e1, e2) => string.Compare(people[e1].Name, people[e2].Name) );

    sortingById.ForEach (x => System.Console.Write (x));
    System.Console.WriteLine ();
    sortingByName.ForEach (x => System.Console.Write (x));

}

因为您可以看到我们有sortingByIdsortingByName。在这些列表的第一个位置,您将找到人员中最低元素的索引(每个元素根据不同的标准)。

如果您想稍后添加更多元素,则必须将新索引插入到所有排序列表集中。由于元素已经排序,您只需要执行二分查找。