2012-05-22 118 views
2

請考慮以下事項。 。 。linq查詢字典上的麻煩<字符串,字典<string, int>>

Dictionary<string, Dictionary<string, int>> myData; 

我想只保留外項,其中int > 1

myData= myData.Select(c => c.Value.Where(i => i.Value > 1)); 

。 。 。拋出轉換錯誤。

謝謝。

編輯

@Saeed給正在做偉大的,但不過我現在需要一些額外的答案。我需要外部字典只包含內部字典有多個條目的條目。 (每次我想我已經知道了,我不知道。我敢肯定,這不是我應該看到的!)

+0

你能說清楚** ** inner'int'(奇異!)是什麼意思嗎? – Jon

回答

3

你應該把它轉換成字典,你也可以簡單地使用匿名類型而不是它的確切類型。

myData= myData 
      .Select(c => new {Key = c.Key, 
          Value = c.Value 
          .Where(i => i.Value > 1) 
          .ToDictionary(y=>y.Key, y=>y.Value)}) 
      .ToDictionary(x=>x.Key, x=>x.Value); 

更新:這樣做,你的額外要求後做:

myData = myData.Where(x=>x.Value.Count() > 1).ToDictionary(x=>x.Key,x=>x.Value); 
+0

更靠近(我認爲),但仍然不正確'System.Collections.Generic.Dictionary '不包含'Key'的定義並且沒有接受類型爲'System.Collections.Generic的第一個參數的擴展方法'Key'。字典'可以找到' –

+0

definitley看起來好多了! LinqPad向我展示了它的編譯,現在我只需要測試結果。謝謝。 –

+0

謝謝@Saeed。我向OP增加了一個額外的要求。 (對不起,謝謝。) –

5

沒有外字典,其中int大於1,因爲每個外部字典「包含」與其內部字典中的整數一樣多。

如果你想保持外詞典其中至少一個int大於1:

myData.Select(d => d.Value.Any(p => p.Value > 1)); 

如果你想保持外字典所有int s爲大於1:

myData.Select(d => d.Value.All(p => p.Value > 1)); 
+0

目前的問題是鑄造問題,我也不認爲OP尋找你提供的東西。 –

0

如果您無法瀏覽您的字典,也許我們該做的是擺脫他們!

var flattened = 
    from kvp1 in myData 
    let s1 = kvp1.Key 
    from kvp2 in kvp1.Value 
    let s2 = kvp2.Key 
    let i = kvp2.Value 
    select new { s1, s2, i }; 

現在有一個很好的平面集合,你應該很容易地過濾到你想要的。

相關問題