2010-08-10 7 views
8

मैं पहली बार कोशिश करते हैं और this question को हल करने के लिए LINQ बाहर की कोशिश करने का फैसला किया पर आधारित व्यायाम।दलाल मेरे LINQ: एक सीखने एक और पोस्ट

मेरी LINQ की अद्भुत दुनिया में प्रथम प्रयास के परिणाम इस तरह देखा:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace ConsoleApplication2 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      List<string> list = new List<string>() 
      { 
       "fred-064528-NEEDED1", 
       "xxxx", 
       "frederic-84728957-NEEDED2", 
       "sam-028-NEEDED3", 
       "-----", 
       "another-test" 
      }; 

      var result = 
      from s in list 
      where (from c in s where c == '-' select c).Count() == 2 
      select s.Substring(s.LastIndexOf("-") + 1); 

      foreach (string s in result) 
       Console.WriteLine(s); 
      Console.WriteLine("Press Enter"); 
      Console.ReadLine(); 
     } 
    } 
} 

मुझे पता है कि कैसे मैं इस काल्पनिक छोटे उदाहरण के लिए ऊपर समाधान सुधार कर सकते हैं करना चाहते हैं। मुझे इस बात में बहुत दिलचस्पी नहीं है कि मैंने सर्वोत्तम सत्यापन विधि का उपयोग किया है, या मैं "एंटर दबाएं" या ऐसा कुछ भी कैसे स्थानीयकृत कर सकता हूं; मैं LINQ के बारे में कुछ और जानने के लिए इस उदाहरण का उपयोग करने में रुचि रखता हूं।

+2

शीर्षक के लिए +1:} –

+0

@serkan - तथ्य। किसी को फिर से – Matt

+0

यह एक घिसा-पिटा कॉमेडी वाक्यांश अजीब चला गया के साथ एक पुस्तक बाहर लाने के लिए की जरूरत है –

उत्तर

6
var result = 
     from s in list 
     where s.Count(x => x == '=') == 2 
     select s.Substring(s.LastIndexOf("-") + 1); 
+1

जहां एस। गणना (x => x == '-') == 2 लेकिन पूरी तरह से। – Toby

+0

आह, यह एक लैम्ब्डा अभिव्यक्ति होगी, फिर –

+0

वास्तव में, पूरे लिनक को संकलित करते समय लैम्ब्डा में परिवर्तित कर दिया जाता है। परावर्तक में इसे देखने की कोशिश करें। – nothrow

4

यह भी लैम्ब्डा अभिव्यक्ति का उपयोग करते लिखा जा सकता है:

var result = 
      list.Where(s => (from c in s where c == '-' select c).Count() == 2).Select(
       s => s.Substring(s.LastIndexOf("-") + 1)); 

मैं धाराप्रवाह इंटरफेस की वजह से LINQ वाक्य रचना के ऊपर लैम्ब्डा भाव पसंद करते हैं। आईएमएचओ यह अधिक मानव पठनीय है।

+0

फ्लुएंट इंटरफ़ेस? –

+0

आह: http://stackoverflow.com/questions/214500/which-linq-syntax-do-you-prefer-fluent-or-query-expression –

+0

आम तौर पर एक धाराप्रवाह इंटरफ़ेस अनुदेश संदर्भ रिले करने के चेनिंग विधि का उपयोग कर कार्यान्वित किया जाता है बाद के कॉल का। (इससे थोड़ा अधिक शामिल है लेकिन यह अभी के लिए करेगा) इस मामले में विधि कहां कहलाती है तो विधि चयन कहा जाता है। – heads5150

4

यह मुझे लगता है कि यह बहुत अच्छा है। आंशिक LINQ।

var result = String.Join("-", inputData.Split('-').Skip(2)); 

अगर कोई नहीं हो सकता '-' के बाद पहले दो तो ऐसा करेंगे (नहीं LINQ):

var result = inputData.Split('-')[2]; //If the last part is NEE-DED then only NEE is returned. And will fail on wrong input 
+0

अच्छा है, लेकिन Substring संस्करण से अधिक स्मृति का उपभोग करता है। – nothrow

+1

मैंने var परिणाम = सूची में से स्ट्रिंग.जॉइन ("", एस। स्प्लिट ('-') का चयन करें। छोड़ें (2)); ग्रेट विचार, लेकिन यह लाल हेरिंग प्रविष्टियों (जैसे "xxxx") पर छेड़छाड़ कर रहा है –

+0

@Yossarian हां आप इसके बारे में सही तरीके से सही हैं।लेकिन यह रेग एक्सप की तुलना में तेज़ होना चाहिए और मुझे लगता है कि यह काफी चिकनाई है। यदि आप सबसे तेज़ संभव चाहते हैं तो आपको LINQ का उपयोग ठीक से नहीं करना चाहिए बल्कि एक और अनिवार्य तरीका है। –

4

मैं lambdas के एक बड़े प्रशंसक भी हूँ ...

static void Main(string[] args) 
    { 
     Func<string, char, int> countNumberOfCharsInString = 
      (str, c) => str.Count(character => character == c); 

     var list = new List<string>() 
     { "fred-064528-NEEDED1", 
      "xxxx", 
      "frederic-84728957-NEEDED2", 
      "sam-028-NEEDED3", 
      "-----", "another-test" 
     }; 

     list.Where(fullString => countNumberOfCharsInString(fullString,'-') == 2) 
      .ToList() 
      .ForEach(s => Console.WriteLine(s.Substring(s.LastIndexOf("-")+1))); 

     Console.WriteLine("Press Enter"); 
     Console.ReadLine(); 
    } 
4

मुझे नहीं लगता कि यह एक सुधार है, के रूप में यह कम पढ़ी जा सकती है, लेकिन आप सूची कक्षा में इनबिल्ट तरीकों के कुछ का उपयोग कर एक-पंक्ति में यह सब कर सकते हैं:

list.FindAll(s => s.ToCharArray(). 
    Where(c => c == '-').Count() ==2). 
    ForEach(c => Console.WriteLine(c.Substring(c.LastIndexOf("-") + 1))); 

व्यक्तिगत रूप से मुझे यह भयानक लगता है, इसलिए यह सिर्फ ब्याज के लिए है!

+0

लेकिन यह मजेदार है! मेरा बहुत ही समान, FindAll का भी अच्छा उपयोग – fletcher

+0

केवल पठनीयता के लिए मैंने "सूची" डाली होगी। ढूँढें सभी (एस => एस। टोकरएरे() कहां (सी => सी == '-')। गणना() = = 2) "सभी एक पंक्ति पर, लेकिन धन्यवाद, आपके समाधान ने मुझे भेड़ के बच्चे और प्रतिनिधियों के बारे में सोचा। सोचो कि मैं उन्हें थोड़ा बेहतर समझता हूं। –

संबंधित मुद्दे