2012-03-16 74 views
1

考慮下面的僞代碼:如何用不屬於對象一部分的變量對對象列表進行排序?

List<Person> People = new List<Person>(); 
int score; 

... 

foreach (Person p in People){ 

score = scoreFunc(p); 

??? 

} 

問題 - 我該如何排序的得分Person對象的名單? 如果您想知道,我不想將得分作爲Person的屬性,因爲對於同一個人來說,在不同情況下它不同,並且在邏輯上不是Person的屬性。

+0

「得分」當然可以根據需要創建一個數組或添加到集合中 – 2012-03-16 04:26:40

回答

5

使用可以比較兩個人的委託/類來進行排序 - 沒有任務需要使用單個屬性來比較它們。例如

People.Sort((p1,p2)=>scoreFunc(p1)-scoreFunc(p2)); 

編輯:

如果要排序的分數整個列表,那麼這將是唯一的方法(可能會更改排序算法,但比較不會改變,因爲分數是分類鍵)。現在上面可能會多次計算某些人的分數 - 所以優化之一可能是緩存人員分數。例如,scoreFunc可以檢查緩存(字典)以查看是否已經計算分數。

根據您的實際需求和計分功能的實施情況可能會發生進一步的優化。例如,假設你有10000人,你可能對前20名感興趣。假設人的年齡和學歷資格貢獻了總分,而另外20個屬性貢獻較小。因此,您可以進行多次排序 - 第一次傳球可以使用僅基於兩個因素的得分來確定排名前500位的人,然後使用詳細得分來獲得實際排名前20位。

+0

謝謝,你認爲你可以擴展一下你的答案,你會如何推薦使用這個比較對整個列表進行排序? – 2012-03-16 07:01:27

+0

@Ivan,我不是100%確定你想在這裏問什麼...但是,儘管如此,看看我的編輯! – VinayC 2012-03-16 08:44:47

相關問題