2011-08-15 24 views
13

का उपयोग कर रहा प्रकार का एक शब्दकोश है बनाना:एक और शब्दकोश से एक शब्दकोश LINQ

IDictionary<foo, IEnumerable<bar>> my_dictionary 

बार वर्ग इस तरह दिखता है:

class bar 
{ 
    public bool IsValid {get; set;} 
} 

कैसे मैं केवल उन वस्तुओं के साथ एक और शब्दकोश बना सकते हैं कि IsValid = सच है।

मैं इस कोशिश की:

my_dictionary.ToDictionary(p=> p.Key, 
          p=> p.Value.Where (x => x.IsValid)); 

ऊपर कोड के साथ समस्या यह खाली गणनीय के साथ एक चाबी बनाता है कि, अगर सब उस कुंजी के लिए तत्वों अगर है = झूठे थे है।

उदाहरण के लिए

:

my_dictionar[foo1] = new List<bar> { new bar {IsValid = false}, new bar {IsValid = false}, new bar {IsValid = false}}; 
my_dictionary[foo2] = new List<bar> {new bar {IsValid = true} , new bar{IsValid = false}; 
var new_dict = my_dictionary.ToDictionary(p=> p.Key, 
          p=> p.Value.Where (x => x.IsValid)); 
// Expected new_dict should contain only foo2 with a list of 1 bar item. 
// actual is a new_dict with foo1 with 0 items, and foo2 with 1 item. 

मैं अपने की उम्मीद कैसे मिलता है।

उत्तर

22

ऐसा कुछ?

my_dictionary 
    .Where(p=> p.Value.Any(x => x.IsValid)) 
    .ToDictionary(p=> p.Key, 
        p=> p.Value.Where (x => x.IsValid)); 

यह केवल आइटम शामिल होंगे जहां मूल्यों IsValid कम से कम एक।

+1

+1 ओ पी का उपयोग कर संग्रह फिल्टर करने के लिए की जरूरत है बनाने के 'Where' कॉल करने से पहले' –

+0

सही ToDictionary'। धन्यवाद – Bitmask

+0

यह पहला है जहां क्लॉज x =>! X.IsValid से छुटकारा पाने के लिए पर्याप्त नहीं है? क्या आप सिर्फ लिख नहीं सकते हैं। टोपी (पी => पी। केई, पी => पी। वैल्यू), चूंकि टोनी को कॉल करने से पहले खंड पहले ही फ़िल्टरिंग लागू कर रहा है? – Prokurors

1
my_dictionary.Where(p => p.Any(v => v.Value.IsValid()) 
      .ToDictionary(p=> p.Key, 
          p=> p.Value.Where(x => x.Value.IsValid()); 

केवल आइटम मूल्य में एक सच्चे है, तो केवल आइटम है कि नए Dictonary में सत्य हैं मिल जाओ।

फ़िल्टर तो Dictonary

1
var new_dict = my_dictionary.Select(x => new KeyValuePair<foo, List<bar>>(
               x.Key, 
               x.Value 
                .Where(y => y.IsValid) 
                .ToList())) 
          .Where(x => x.Value.Count > 0) 
          .ToDictionary(x => x.Key, x => x.Value.AsReadOnly()); 
संबंधित मुद्दे