2011-03-03 27 views
1

說我有一個Dictionary對象,它包含一個名爲SomeObject的對象的許多實例,每個SomeObject具有名爲Property1和Property2的屬性。現在說我有一個方法可以返回按Property1排序的新字典。但是,我想概括一下這個方法,以便我可以告訴它要排序的屬性。通用化方法'獲取'任何對象屬性

例如,要做到這一點,我知道我可以輕鬆擁有兩種不同的方法,如:

public Dictionary<string, SomeObject> SortByProp1(Dictionary<string, SomeObject> dict) { ... } 
public Dictionary<string, SomeObject> SortByProp2(Dictionary<string, SomeObject> dict) { ... } 

但是,我不知道是否有可能將這些組合成一個方法中,我可以給一個參數來確定返回哪個方法?我不知道有什麼辦法來推廣這樣的財產...

注意:我意識到我總是可以使用像if語句可能基於屬性名稱的字符串,但這看起來不像是一個非常優雅的,可以接受的答案,遠遠好於僅僅有兩種獨立的方法。

+0

「Dictionary」不能排序。你需要在返回值中有一個'SortedDictionary'。 – kennytm 2011-03-03 02:49:00

+0

SortedDictionary是在鍵上排序的,我需要根據其中一個屬性進行排序。我已經實現了該方法,但只有給定的屬性(意味着我需要多個方法來對值的不同屬性進行排序)。 – JToland 2011-03-03 03:07:28

回答

4

你所尋求的方法是建立在IEnumerable<T>接口,並且爲OrderBy,雖然它可能無法正常工作了作爲smothly的字典,你可能會喜歡。

Dictionary<TKey, TValue> implements IEnumerable<KeyValuePair<TKey, TValue>>,所以它的OrderBy方法需要一個lambda表達式,它本身需要KeyValuePair<TKey, TValue>,並返回一個選擇器方法來描述你正在排序的內容。

舉例來說,如果你有Dictionary<int, Customer>,這將返回給你的客戶名稱排序的IEnumerable<KeyValuePair<int, Customer>>

myDict.OrderBy(kvp => kvp.Value.Name); 

然後只獲取客戶自己在這個排序順序,你會說:

IEnumerable<Customer> orderedByName = myDict.OrderBy(kvp => kvp.Value.Name).Select(kvp => kvp.Value); 
+1

事實上,傳遞lambda表達式或任何其他委託是解決方案。 – 2011-03-03 02:57:17

2

您可以嘗試添加一個泛型類型參數,對於排序鍵 - 並接受謂詞排序嗎?

如:

public Dictionary<string, SomeObject> SortByProp<TProp>(Dictionary<string, SomeObject> dict, Expression<SomeObject,TProp> orderPredicate) 
{ 
    return dict.OrderBy(orderPredicate); 
} 

// Usage: 
SortByProp(apples, x => x.AppleColor); 
SortByProp(oranges, x => x.OrangeType); 
2

您可以接受委託來選擇屬性:

public Dictionary<string, SomeObject> Sort<TProperty>(Dictionary<string, SomeObject> dict, Func<SomeObject, TProperty> selector) { ... } 

你可以這樣稱呼它:

var sortedDict = Sort(dict, o => o.Property1);