2013-11-01 51 views
17

我旁邊的字典在C#LINQ選擇C#字典

Dictionary<string, object> subDictioanry = new Dictionary<string, object>(); 

List<Dictionary<string, string>> subList = new List<Dictionary<string, string>>(); 
subList.Add(new Dictionary<string, string>(){ 
{"valueLink", "link1"}, 
{"valueTitle","title1"} 
}); 
subList.Add(new Dictionary<string, string>(){ 
{"valueLink", "link2"}, 
{"valueTitle","title2"} 
}); 
subList.Add(new Dictionary<string, string>(){ 
{"valueLink", "link3"}, 
{"valueTitle","title3"} 
}); 

subDictioanry.Add("title", "title"); 
subDictioanry.Add("name", "name"); 
subDictioanry.Add("fieldname1", subList); 

Dictionary<string, object> exitDictionary = new Dictionary<string, object>(); 
exitDictionary.Add("first", subDictioanry); 
exitDictionary.Add("second", subDictioanry); 

是否有可能讓所有「valueTitle」與LINQ的幫助下選擇?

UPDATE: 對不起,我應該是第一個寫 - 我需要得到源於exitDictionary,而不是從子列表

+1

如果您使用類而不是字典,這將更容易推理。只是說。 – millimoose

回答

17

如果由搜索值,試試這個:

var r = exitDictionary 
    .Select(i => i.Value).Cast<Dictionary<string, object>>() 
    .Where(d => d.ContainsKey("fieldname1")) 
    .Select(d => d["fieldname1"]).Cast<List<Dictionary<string, string>>>() 
    .SelectMany(d1 => 
     d1 
     .Where(d => d.ContainsKey("valueTitle")) 
     .Select(d => d["valueTitle"]) 
     .Where(v => v != null)).ToList(); 

如果你是價值的subDictionaryDictionary<string, object>明確)類型看,你可以這樣做:

var r = exitDictionary 
    .Select(i => i.Value).Cast<Dictionary<string, object>>() 
    .SelectMany(d=>d.Values) 
    .OfType<List<Dictionary<string, string>>>() 
    .SelectMany(d1 => 
     d1 
     .Where(d => d.ContainsKey("valueTitle")) 
     .Select(d => d["valueTitle"]) 
     .Where(v => v != null)).ToList(); 

兩個選擇將返回:

title1 
title2 
title3 
title1 
title2 
title3 
4

這將返回匹配您的鑰匙valueTitle

subList.SelectMany(m => m).Where(kvp => kvp.Key == "valueTitle").Select(k => k.Value).ToList(); 
+2

這是不正確的。 'kvp'不會是'KeyValuePair',它會是'Dictionary '。您錯過了一個'SelectMany'來平整列表。 – Arran

+1

@Arran Doh,我忽略了這一點。我編輯過。 – gleng

8

一種方式,所有的值將是首先拼合與SelectMany名單:

subList.SelectMany(m => m).Where(k => k.Key.Equals("valueTitle")); 
+3

+1正確的解決方案! – gleng