![](/img/trans.png)
[英]EnableQueryAttribute with PageSize messes up pre-sorted list
[英]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.