繁体   English   中英

基于预排序列表对列表进行排序

[英]Sort a List based on a Pre-Sorted List

如何根据预先排序的列表对列表进行排序。

我有一个已经排序的列表。 说,我的排序列表是

{"Junior Developer", "Developer", "Senior Developer", "Project Lead"}

现在,我想按照与上面列表相同的顺序对上面列表的任何子集进行排序。 也就是说,如果我有输入

{"Developer", "Junior Developer"} ,我希望输出为{"Junior Developer", "Developer"}

如果输入是{"Project Lead", "Junior Developer", "Developer"} ,我希望输出为

{"Junior Developer", "Developer", "Project Lead"}. 

我怎样才能实现同样的目标?

最简单的方法是使用LINQ的.OrderBy扩展方法,以及预排序集合的IndexOf方法(或等效方法)。 这里的想法是使用不同的值作为“排序键”进行排序(这非常有用,因为我们通常希望根据其属性之一对对象进行排序)。

var sorted = listToSort.OrderBy(s => listPreSorted.IndexOf(s)).ToList();

这是阵列的一个例子: http//ideone.com/7oshhZ


请注意,如果列表非常大,这可能会很慢,因为目标列表中的每个项目都必须在预先排序的集合中按顺序查找( O(N * M) ,其中N是目标的长度列表, M是预先排序列表的长度)。

要克服此限制,您可以生成将预排序列表的项目映射到其索引的查找,然后在.OrderBy使用此查找(这将具有O(N + M)的运行时,并且您可以重新如果需要,使用查找):

var preSortedLookup =
        listPreSorted.Select((v, i) => new { Key = v, Value = i })
                     .ToDictionary(kvp => kvp.Key, kvp => kvp.Value);

var sorted = listToSort.OrderBy(s => preSortedLookup[s]).ToList();

如果两个列表中没有一个重复 ,那么您只需使用Intersect ,它将保留顺序:

var allRoles = new[] {"Junior Developer", "Developer",
                      "Senior Developer", "Project Lead"};
var roles = new[] {"Developer", "Junior Developer"};
var sortedRoles = allRoles.Intersect(roles);

这可能比通过IndexOf排序更有效,但除非列表很长,否则你不太可能注意到很多差异。

假设您有一个排序列表listA,另一个列表是listB。 每次从listB读取时,检查元素是否在listA中,并根据该列表的顺序。

如果你负担很重,试试一本字典?

1,

dictionary<string,int>

使用此字典存储字符串和索引

2,生成一个list<string> result集长度作为带有Dummy数据的字符串数

3然后找到正确的索引号将索引字符串写入result

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM