我有一个作为类实现的自定义结构,因为我需要为单个客户提供单个实例。它有很多字段,比方说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%的记录。
答案 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));
}
因为您可以看到我们有sortingById
和sortingByName
。在这些列表的第一个位置,您将找到人员中最低元素的索引(每个元素根据不同的标准)。
如果您想稍后添加更多元素,则必须将新索引插入到所有排序列表集中。由于元素已经排序,您只需要执行二分查找。