2015-12-20 82 views
3

我有一個用戶列表,我想按ID排序。所以,現在由用戶全名這樣的列表進行排序:使用LINQ OrderBy按ID排序列表

OrderBy(m => m.FullName).ToList(); 

我想要做的就是爲了這個列表,這樣一個特定的ID被設置爲開始索引。

因此,僞代碼將是:

var passedId = 2123 

OrderBy(m=>m.ID); // And then set passedId to be in the start index of the list 

這可能嗎?

謝謝。

+3

可以顯示一些示例輸入\輸出嗎?很難理解你在問什麼。 –

+0

我不明白你需要看什麼。清單包含用戶屬性。其中一個屬性是ID。我想傳遞ID給控制器,然後用這個ID作爲開始索引來排列我的列表。 – Lahib

+0

不清楚你想要什麼,但最好猜測 - '.Where(m => m.ID> = thisID).OrderBy(m => m.ID)' –

回答

1

我個人不喜歡依靠bool排序(看起來很奇怪,不自然)並更喜歡使用明確的表達。在你的情況下,像這樣

// ... 
.OrderBy(m => m.ID == passedId ? 0 : 1) 
.ThenBy(m => m.FullName) // or whatever is needed 

即使列表已經被一些未知的標準有序,你仍然可以申請OrderBy(W/O ThenBy),如上述,因爲根據Enumerable.OrderBydocumentation

該方法執行穩定的排序;也就是說,如果兩個元素的鍵相等,則元素的順序被保留。

+0

謝謝你的共享示例,這個工作完美 – Lahib

+0

我想知道爲什麼布爾版本沒有爲OP工作。 –

1

你可以這樣做。

var passedId = 2123; 
list = list.OrderByDescending(m => m.Id == passedId).ThenBy(m => m.FullName).ToList(); 

這使具有特定id的用戶成爲第一個,其他人將按名稱排序。

或者,如果列表已按名稱排序,則可以執行此操作。

var user = list.FirstOrDefault(m => m.Id == passedId); // find user with id 
if(user != null) 
{ 
    list.Remove(user); // remove user 
    list.Insert(0, user); // add user to beginning. 
} 
+0

由於某種原因,我無法使用你建議的第一個例子。它仍然以全名命令用戶。第二個例子我不能使用,因爲我不能在indexOf中使用lambda表達式,因爲它需要一個用戶作爲參數 – Lahib

+0

@Lahib ive編輯了第二個代碼。它現在應該工作。 btw第一個代碼嘗試將其更改爲'list.OrderBy(m => m.FullName)。ThenByDescending(m => m.Id == passedId)' –

+0

我感謝你的幫助,我很欣賞它, – Lahib

2

您可以使用LINQ提供的OrderBy和ThenBy表達式。

訂貨的時刻第一個也是最重要的規則是:對象如你所說的指定ID匹配,所以排序依據應以此爲條件。第二條規則是按名稱訂購,因此您應該使用帶有m.FullName條件的ThenBy

var orderedList = list.OrderBy(m => m.ID == specifiedId).ThenBy(m => m.FullName).ToList(); 

下面是其中有一個很好的和明確的答案adressing排序依據和ThenBy的計算器另一個問題:

https://stackoverflow.com/a/3760014/5698997

+0

這裏'OrderBy '在最後移動真實的物品。因爲升序是'false - > true'。你應該使用降序,即'真 - >虛假' –

+0

我試着這樣做。但由於某種原因,它仍然需要全名排序。也許它與這個列表有關係,也是在其他地方訂購的,或者這並不重要? – Lahib

相關問題