2012-02-06 137 views
2

列表我有以下型號排序與排序依據

public class UserViewModel 
    { 
     public String CVR_Nummer { get; set; } 
     public DateTime LastActivityDate { get; set; } 
     public DateTime CreationDate { get; set; } 
     public String FirmaNavn { get; set; } 
     public int ProcentAnswered { get; set; } 
    } 

我創建了一個List<UserViewModel>並試圖對它進行排序:

userviewmodel.OrderBy(x => x.ProcentAnswered); 

它編譯,但名單犯規得到排序。怎麼來的?

+0

如何知道該列表是**不是**排序? – Tigran 2012-02-06 12:33:23

回答

4

LINQ是免費的副作用設計,所以它不會改變輸入。它也使用延遲執行,直到嘗試訪問數據時纔會執行任何操作。重新分配輸出到列表,它應該工作。請注意,我在這裏使用ToList()方法,因爲OrderBy()返回IEnumerable<UserViewModel>,直到我們嘗試獲取其中的項目纔會對其進行評估。我們使用ToList()方法從這個序列創建一個新列表並強制查詢執行。

userviewmodel = userviewmodel.OrderBy(x => x.ProcentAnswered).ToList(); 
+1

我會說「由*設計*免費副作用」。 – 2012-02-06 12:38:45

+0

@PeterWone謝謝。 – 2012-02-06 12:39:48

1

你可以嘗試

userviewmodel = userviewmodel.OrderBy(x => x.ProcentAnswered).ToList(); 
3

LINQ查詢懶洋洋地執行,這意味着它們不執行,直到源對象是列舉。而且,查詢從不在實際對象上運行,而是返回一個新實例。

要強制當場執行,你必須顯式調用.ToList()創建查詢後:

userviewmodel = userviewmodel.OrderBy(x => x.ProcentAnswered).ToList(); 
+0

+1喜歡懶洋洋的。 – 2012-02-06 12:39:05

1
userviewmodel.OrderBy(x => x.ProcentAnswered); 

這是一種表達,不修改的東西的指令。表達式的值是你的排序列表,但你並沒有將它捕獲到一個變量中,而且LINQ表達式是懶惰評估的,所以因爲你沒有捕獲結果而迫使它解決,所以這個語句沒有任何影響。

2

在這個userviewmodel.OrderBy(x => x.ProcentAnswered);你剛纔查詢準備,你甚至沒有排序列表

在這個userviewmodel.OrderBy(x => x.ProcentAnswered).ToList();你有解僱查詢,並已整理列表,但是上面的表達式將會給您耳目一新的列表

所以,你需要做到這一點

userviewmodel = userviewmodel.OrderBy(x => x.ProcentAnswered).ToList(); 

受到大家的建議。

希望這對你有用。