3 回答
TA贡献1794条经验 获得超7个赞
尝试这个:
var orderOfDepts = new List<string> { "P", "A", "Z" };
var sortedList =
(
from x in myList
join dept in orderOfDepts.Select((name, index) => new { name, index }) on x.dept equals dept.name
orderby dept.index, x.order
select x
).ToList();
它应该是相当有效的。
TA贡献1859条经验 获得超6个赞
好吧,您可以使用排序规则创建一个列表:
var orderOfDepts = new List<string> { "P", "A", "Z" };
并使用该列表中元素的索引进行排序:
var sortedList = myList.OrderBy(x=> orderOfDepts.IndexOf(x.dept)).ThenBy(x=> x.order).ToList();
sortedListPS 如果集合不是太大,那么这个解决方案很好,但如果它很大或者orderOfDepts 列表中有很多排序规则,那么您可能希望将该算法的整体复杂性从 > 降低O(N2) 到接近 的程度O(N*logN)。
为此,我们可以利用Dictionary快速查找:
int o;
var orderOfDepts = new Dictionary<string, int>
{
{ "P", 0 },
{ "A", 1 },
{ "Z", 2 }
};
var sortedList = myList.OrderBy(x => orderOfDepts.TryGetValue(x.dept, out o) ? o : int.MaxValue)
.ThenBy(x=> x.order)
.ToList();
这里我们尝试通过 key 从字典中获取元素x.dept。如果我们没有找到任何内容,我们会将该项放在列表的末尾,否则我们将使用字典中的值进行排序。
字典的查找时间复杂度为 O(1),因此它将极大地提高性能,但代价是构造字典对象所需的时间。对于少数元素,不建议这样做,第一个解决方案更好,但对于大量数据,这个解决方案很好。
- 3 回答
- 0 关注
- 167 浏览
添加回答
举报