2012-01-18 8 views
7

मेरे पास List<string> है, और इनमें से कुछ तार संख्याएं हैं। मैं इस सबसेट को List<int> में निकालना चाहता हूं।तारों की सूची से इंक निकालने के लिए LINQ का उपयोग

मैंने इसे एक वर्बोज़ दिखने के तरीके में किया है - जैसा कि नीचे है - लेकिन मुझे लगता है कि यह संरचना करने के लिए एक साफ-सुथरा LINQ तरीका होना चाहिए। कोई विचार?

List<string> myStrs = someListFromSomewhere; 
List<int> myInts = new List<int>(); 

foreach (string myStr in myStrs) 
{ 
    int outInt; 
    if (int.TryParse(myStr, out outInt)) 
    { 
     myInts.Add(outInt); 
    } 
} 

जाहिर है मैं इस के लिए एक समाधान की जरूरत नहीं है - यह मेरे LINQ शिक्षा के लिए मुख्य रूप से है।

+2

मेरे लिए एक और अवसर राज्य के लिए 'काश TryParse किसी पूर्णांक वापसी होगी?' (मुझे पता है, विरासत ...) –

+0

निश्चित रूप से अधिक कुशल नहीं है, लेकिन आप 'var myInts = myStrs.Where (s => int.TryParse (s, out outnt) कर सकते हैं)। (S => int.Parse (एस)) ', जब तक आप पहले से ही परिभाषित नहीं किया गया था। यह प्रत्येक स्ट्रिंग पर 'TryParse' * और * पार्स को कॉल करता है, हालांकि - मैं वास्तव में यह सुझाव नहीं दूंगा कि – rejj

+2

यह प्रश्न रुचि का हो सकता है: [LINQ क्वेरी प्रक्षेपण करने के लिए, उन मामलों को छोड़ना जहां प्रक्षेपण अपवाद का कारण बनता है] (http://stackoverflow.com/questions/7188623/linq-query-to-perform-a-projection-skipping-cases-where-the-projection-would-ca) मैं आपके सटीक मामले को उदाहरण के रूप में उपयोग करता हूं। –

उत्तर

23

आप इस तरह यह कर सकते हैं:

int parsed = 0; 

myInts = myStrs.Where(x => int.TryParse(x, out parsed)).Select(x => parsed); 

यह काम करता है क्योंकि LINQ ऑपरेटरों के निष्पादन आस्थगित है, जिसका अर्थ: में
प्रत्येक आइटम के लिए myStrs पहले Where में कोड निष्पादित होने और परिणाम में लिखा parsed। और यदि TryParsetrue लौटा Select में कोड निष्पादित किया गया है। इस आइटम को अगले आइटम के लिए चलाने के पहले एक आइटम के लिए यह पूरा कोड चलाया जाता है।

+3

मेरे लिए बहुत नाजुक लग रहा है। – dtb

+1

@ डीटीबी: बिलकुल नहीं। यदि ऐसा होता है, तो आप वास्तव में LINQ की आंतरिक कार्यप्रणाली को नहीं समझते हैं। –

+1

बस यह कहकर कि मुझे अपने स्वाद के लिए LINQ की आंतरिक कार्यप्रणाली के बारे में बहुत अधिक जानकारी की आवश्यकता है। – dtb

7

LINQ और out पैरामीटर अच्छी तरह से मिश्रण नहीं करते हैं। आप ऐसा कर सकता है:

var myInts = myStrs 
    .Select(s => 
    { 
     int outInt; 
     return int.TryParse(s, out outInt) ? (int?)outInt : null; 
    }) 
    .Where(i => i.HasValue) 
    .Select(i => i.Value) 
    .ToList(); 
+0

+1 - बिल्कुल जिस समाधान को मैं पोस्ट करने वाला था। –

+4

पूर्ण ओवरकिल –

+0

क्या यह वास्तव में * डाउनवोट के लायक है? यह गलत नहीं है? – Yuck

0

के बाद से इस LINQ शिक्षा के लिए है ... तुम सच में देख रहे हैं कि यह कैसे केवल LINQ वाक्य रचना के साथ किया जा सकता है के लिए, एक अन्य विकल्प एक वर्ग है कि समाहित करने के लिए पार्स तर्क स्थानांतरित करने के लिए है परिणाम और मूल्य।

var myInts = from val in myStrs 
      let parserVal = new Parser(val) 
      where parserVal.IsInt 
      select parserVal.Val; 

जहां पार्सर कुछ इस तरह है ...

class Parser 
{ 
     public bool IsInt { get; set; } 
     public int Val { get; set; } 

     public Parser(string val) 
     { 
      int outVal; 
      IsInt = int.TryParse(val, out outVal); 
      if (IsInt) 
      { 
       Val = outVal; 
      } 
     } 
} 
संबंधित मुद्दे