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 關注
- 225 瀏覽
添加回答
舉報