2012-08-24 73 views
4

我有LINQ查詢字典針對列表

List<string> selectedOptions; 
Dictionary<string,string> masterList; 

masterList包括鍵,它們是用於selectedoptions的值超集的。 現在,我想提取selectedOptionsmasterList之間相交鍵的所有值。

LINQ查詢將如何構造?

回答

10
IEnumerable<KeyValuePair<string,string>> results = 
    dic.Join(keys, d => d.Key, x => x, (a, b) => a); 

或課程的

var results2 = keys.Select(k => new {key = k, value = dic[k]}); 

,但如果不存在鍵,這將炸彈。

你可以用Where(k => dic.ContainsKey(k))條款解決這個問題:

var results3 = keys 
    .Where(k => dic.ContainsKey(k)) 
    .Select(k => new {key = k, value = dic[k]}); 

拖網LINQ的源之後,我認爲最後的方法可能是最有效的。做一個聯合強制linq在聯接中涉及的一個集合上創建一個Lookup(實際上是一個多項散列表)。鑑於我們已經有一個字典提供與Lookup相同的查找性能,建立一個Lookup是多餘的。

+0

這不符合我的目的。我需要從字典中過濾匹配鍵的值。這仍然返回匹配的鍵。不知道我在解釋代碼時是否做了任何錯誤... – GilliVilla

+0

@GilliVilla - results3返回一個包含鍵和值的列表,究竟是什麼問題? – Hogan

+0

@Hogan你是對的。一切都很好。 – GilliVilla