2012-03-04 23 views
1
string[] strLst = { "One", "Three" }; 
     Dictionary<string, Customer> dicDocTypes = new Dictionary<string, Customer>(); 
     dicDocTypes.Add("One", new Customer { Id = 1, Name = "Rabi" }); 
     dicDocTypes.Add("Two", new Customer { Id = 2, Name = "Shuvankar" }); 
     dicDocTypes.Add("Three", new Customer { Id = 3, Name = "Krishna" }); 
     dicDocTypes.Add("Four", new Customer { Id = 4, Name = "Suresh" }); 

     var rootNodes = from node in dicDocTypes 
         where node.Key.Contains(**strLst**) 
         select new KeyValuePair<string, Customer>(node.Key, node.Value); 

問題在一個字符串[]中存在如何篩選字典值:如何篩選詞典詞條,如果按鍵與一個字符串匹配[]如果其主要使用LINQ

回答

3

而不是試圖詢問的關鍵它屬於一個數組,你可以問數組,如果它包含的關鍵:

var rootNodes = from node in dicDocTypes 
       where strLst.Contains(node.Key) 
       select new KeyValuePair<string, Customer>(node.Key, node.Value); 

如果你有很多的項目,這將是更快地使用一個HashSet而不是數組(O(1)查找代替O(n)查找):

var strLst = new HashSet<string> { "One", "Three" }; 

此外,您還可以簡化選擇這樣:

var rootNodes = dicDocTypes.Where(n => strLst.Contains(n.Key)); 

此外,還有初始化字典一個更清潔的方式:

var dicDocTypes = new Dictionary<string, Customer> { 
    { "One", new Customer { Id = 1, Name = "Rabi" } }, 
    { "Two", new Customer { Id = 2, Name = "Shuvankar" } }, 
    { "Three", new Customer { Id = 3, Name = "Krishna" } }, 
    { "Four", new Customer { Id = 4, Name = "Suresh" } } 
}; 
+0

我也發現了同樣的事情。謝謝Cameron – Gururaj 2012-03-04 17:16:45

0
var rootNodes = dicDocTypes.Join(strList, kvp => kvp.Key, s => s, (kvp, str) => kvp); 
2

正如卡梅隆所說,你只是以錯誤的方式提問。但是,您可以使你的代碼更簡單 - 在字典中的「節點」已經​​是一個KeyValuePair,因此,所有你需要的是:

var rootNodes = dicDocTypes.Where(pair => strLst.Contains(pair.Key)); 

如果您需要在最後一個新的字典,你可以使用該ToDictionary方法:

var rootNodes = dicDocTypes.Where(pair => strLst.Contains(pair.Key)) 
          .ToDictionary(pair => pair.Key, pair => pair.Value); 

如果你的字符串列表被過濾變得更長,你可能要考慮將它HashSet<string>,而不是一個數組。