Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何为一个列表保留多个排序顺序<;MyStructure>;_C#_.net_Sorting_Optimization - Fatal编程技术网

C# 如何为一个列表保留多个排序顺序<;MyStructure>;

C# 如何为一个列表保留多个排序顺序<;MyStructure>;,c#,.net,sorting,optimization,C#,.net,Sorting,Optimization,我有一个作为类实现的自定义结构,因为我需要为一个客户提供一个实例。它有很多字段,比如说5个字段: public class SCustomer { public Guid ID; public int PriorityIndex; public string Name; public DateTime BirthDate; public double Rating; } 在我拥有的业务逻辑中,我经常需要使用不同的比较策略对这些结构的列表进行排序,即Lis

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

public class SCustomer
{
    public Guid ID;
    public int PriorityIndex;
    public string Name;
    public DateTime BirthDate;
    public double Rating;
}
在我拥有的业务逻辑中,我经常需要使用不同的比较策略对这些结构的列表进行排序,即
List
,有些是作为实例比较器的实现者,有些是匿名委托

由于性能原因,每次需要新订单时,都不能对单个
列表进行排序。维护尽可能多的列表和我需要的排序顺序是一件痛苦的事情,也就是说,我需要保持它们的同步,因为列表定期(不频繁)更新,并且更新是批量更新

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

供参考:列表大小约为100000项。更新率约为每1000个读取场景周期更新1次。更新涉及大约10%的记录

维护尽可能多的列表和我需要的排序顺序是一件痛苦的事情,也就是说,我需要保持它们的同步,因为列表定期(不频繁)更新,并且更新是批量更新

您只需创建一个父列表,该列表在内部包含的列表数量与排序顺序相同。父列表可以公开内部列表及其不同的排序顺序(可能是只读列表)。因此,您只有一个界面来管理您的项目,您可以随时按排序顺序访问它们


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

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

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

}
public-class-SCustomer
{
公共SCustomer(整数ID,字符串名称)
{
this.ID=ID;
this.Name=Name;
}
公共int ID;
公共字符串名称;
}
公共静态void Main(字符串[]args)
{
列表人员=新列表();
斯库斯托默客户1=新斯库斯托默(11,“罗伯特”);
SCustomer customer2=新的SCustomer(5,“凯特”);
斯库斯托默客户3=新斯库斯托默(23,“大卫”);
添加(customer1);
添加(customer2);
添加(customer3);
List sortingById=新列表();
List sortingByName=新列表();
对于(int i=0;i 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
。在这些列表的第一个位置,您将找到人中最低元素的索引(每个元素根据不同的标准)。


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

您提到了数据库,为什么不使用它呢?正如Tim所说。这完全取决于行数、更新频率、数据库的延迟等@TimSchmelter我确实使用数据库。问题是我需要在.NET端有相当大的缓存,我需要它以几种不同的方式进行排序。@ZverevEugene:afaik您已经排除了所有可行的选项:多列表方法因为内存和同步问题太多,单列表总是因为性能低而排序,数据库因为您认为它太慢。你为什么需要这么大的清单?通常,您只需直接从数据库中选择所需的内容,并按所需顺序进行选择。“我需要一个相当大的缓存”。这听起来像是你的问题。根据我的经验,编程中有两个困难的未解决问题,1)缓存2)命名3)一个错误。参考变量也需要32位(或64位系统上的64位)。因此,100000个项目和10个不同的排序顺序只需要(64位=8字节;1000000*8字节=8.000.000字节=7 MB)。我不确定使用索引而不是引用的效果是否合理(唯一的优点是64位主机上的内存消耗减少了3.5 MB)。你是对的,没有太大的改进。这只是一种不同的方式。我喜欢这个想法,并会尝试一下,谢谢。可能我应该尝试将索引数据保存在
数组中
?保留一些空间,并在需要时进行扩展。。。