2009-03-16 23 views
27

मैं प्रकार B की वस्तुओं की एक सूची के होते हैं जो प्रकार A का एक उद्देश्य मिल गया है करने के लिए सूची:Linq: सूचियों की एक लंबी सूची

class A { list<B> Alist;} 
class B { string C; string D;} 

मेरा कार्यक्रम में मैं A वस्तुओं की एक सूची है:

list<A> listOfA = computeAList(); 

और मैं सभी C उस सूची में तार का चयन करना चाहते हैं। निम्नलिखित कथन मैंने आशा की थी कि मुझे वह परिणाम देगा जो मैं चाहता था; ':

var query = from objectA in listOfA 
      select objectA.Alist.FindAll(x => x.C.Length > 0).C; 

वहाँ एक रास्ता सभी C की एक सूची प्राप्त करने के लिए है s' के बजाय रों यह C युक्त सूचियों की सूची लौटाता है?

उत्तर

46

ybo का उत्तर भी मेरी पहली प्रतिक्रिया होगी। इस की क्वेरी अभिव्यक्ति बराबर है:

var query = from a in computeAList() 
      from b in a.Alist 
      select b.C; 

पूर्णता के लिए, इस सूत्र में अन्य उत्तर एक ही विषय में बदलाव कर रहे हैं।

ybo से (ठीक उसी क्वेरी, डॉट नोटेशन के रूप में व्यक्त):

var query = listOfA.SelectMany(a => a.Alist, (a, b) => b.C); 

रे हेस से (कहाँ खंड सहित, मैं थोड़ा रिफ़ॉर्मेट किए हैं):

var query = listOfA.SelectMany(a => a.AList, (a, b) => b.C) 
        .Where(c => c.Length > 0); 
+0

वही था जो मैं खोज रहा था - बहुत बहुत धन्यवाद जॉन! – Chau

+0

@ जोन, क्षमा करें, मैंने आपकी टिप्पणी नहीं देखी। अब * आप * रे का जवाब शामिल कर सकते हैं;)। आप और रे दोनों के लिए धन्यवाद। – ybo

+0

मैं अब तक इस जवाब के बारे में 20 बार गया हूं। मुझे नहीं पता कि मुझे "selectmany" क्यों याद नहीं है और हमेशा "selectall" आज़माएं, लेकिन यह हमेशा होता है। भाग्यशाली यह हमेशा एक गूगल दूर है! – statue

14

मैं भी एक समान जवाब होता, मेरा एकमात्र संशोधन खाली स्ट्रिंग्स (जहां सी खाली है) से बचने के लिए कहां जोड़ना था:

listOfA.SelectMany(a => a.AList, (a, b) => b.C).Where(c => c.Length > 0); 
संबंधित मुद्दे