2015-08-29 79 views
2

我有一個包含學生數據字典列表 這多少有點像排序基於一個關鍵

List<Dictionary<string, object>> students = new List<Dictionary<string, object>>(); 
Dictionary<string, object> std1 = new Dictionary<string, object>(); 
std1["name"] = "sai"; 
std1["age"] = 22; 
std1["gender"] = "male"; 
students.Add(std1); 

Dictionary<string, object> std2 = new Dictionary<string, object>(); 
std2["name"] = "Julia"; 
std2["gender"] = "female"; 
students.Add(std2); 

Dictionary<string, object> std3 = new Dictionary<string, object>(); 
std3 ["name"] = "sunny"; 
std3 ["age"] = 23; 
students.Add(std3); 

我想排序學生的基礎上無論是nameage或列表詞典列表gender,我想是這樣的:

var ordered = students.OrderBy(x => x["name"]); 

如果我嘗試用兩種agegender它返回一個錯誤,關鍵是沒有找到,如std2沒有agestd3沒有gender

我需要的所有記錄,即使它不包含排序鍵的值,任何方式來解決這個問題,在此先感謝。

+1

是否有使用字典而不是類的特定原因? – cubrr

回答

1

如果要通過一鍵,是不是存在於所有的字典進行排序,你需要使用條件三元返回默認值,而不是,例如0

var ordered = students.OrderBy(dict => 
{ 
    string name; 
    if (!dict.TryGetValue("name", out name)) 
     return ""; 
    return name; 
}); 

較短的版本運營商:

var ordered = students.OrderBy(dict => 
{ 
    string name; 
    return dict.TryGetValue("name", out name) ? name : 0; 
}); 

我用Dictionary.TryGetValue(...)它返回一個布爾描繪鍵是否在字典中發現它的返回值。

+0

真棒:) +1對TryGetValue的解釋 –

1

可以通過提供一個GetOptional方法返回情況下,一些默認對象解決這個問題,當字典沒有一個特定的密鑰:

V GetOptional<K,V>(IDictionary<K,V> d, K key, V absent) { 
    V res; 
    return d.TryGetValue(key, out res) ? res : absent; 
} 

現在您可以排序是這樣的:

var byName = students.OrderBy(x => GetOptional<string,object>(x, "name", "----")); 
var byAge = students.OrderBy(x => GetOptional<string,object>(x, "age", "10000")); 

注:使用字典這樣給你的靈活性,在清晰度爲代價的。通常最好定義一個特殊的類型,而不是使用通用的鍵 - 值對集合。

+0

謝謝:),它幫助我 –

3

這是更好地創建一個類是這樣的:

public class YourClass 
{ 
    public string Name { get; set; } 
    public int Age { get; set; } 
    public string Gender { get; set; } 
} 

然後:

List<YourClass> students = new List<YourClass>(); 
YourClass std1 = new YourClass(); 
std1.Name = "sai"; 
std1.Age = 22; 
std1.Gender = "male"; 
students.Add(std1); 

yourClass std2 = new yourClass(); 
std2.Name = "Julia"; 
std2.Gender = "female"; 
students.Add(std2); 

yourClass std3 = new yourClass(); 
std3.Name = "sunny"; 
std3.Age = 23; 
students.Add(std3); 

var ordered = students.OrderBy(x => x.Name); 

這種安排存儲您在多個詞典有相同的數據。但是,它更加清晰和可以理解。

+0

謝謝:),它幫助 –

+1

@satishkumarV這絕對是你應該去的解決方案,除非你**必須**使用字典。 – cubrr

+1

是的,我同意你的看法,但事情是字典可能包含任何數據和任何鍵,有時它可能包含學生數據,其他時間員工和地址在另一個時間,我不能創建100或1000的類,無論如何,如果鍵的列表是恆定的,並且解決這個解決方案可能是真棒:)並感謝您的建議。 –