如何根据预先排序的列表对列表进行排序.
我有一个已经排序的列表.说,我的排序列表是
{"Junior Developer", "Developer", "Senior Developer", "Project Lead"}
Run Code Online (Sandbox Code Playgroud)
现在,我想按照与上面列表相同的顺序对上面列表的任何子集进行排序.也就是说,如果我有输入
{"Developer", "Junior Developer"},我希望输出为 {"Junior Developer", "Developer"}
如果输入是{"Project Lead", "Junior Developer", "Developer"},我想输出为
{"Junior Developer", "Developer", "Project Lead"}.
Run Code Online (Sandbox Code Playgroud)
我怎样才能实现同样的目标?
voi*_*hos 11
最简单的方法是使用LINQ的.OrderBy扩展方法,以及IndexOf预排序集合的方法(或等效方法).这里的想法是使用不同的值作为"排序键"进行排序(这非常有用,因为我们通常希望根据其属性之一对对象进行排序).
var sorted = listToSort.OrderBy(s => listPreSorted.IndexOf(s)).ToList();
Run Code Online (Sandbox Code Playgroud)
这是阵列的一个例子: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();
Run Code Online (Sandbox Code Playgroud)