LINQ किस समस्या के लिए बनाया गया है?


12

जब भी मुझे C # पर स्टैक ओवरफ्लो पर पोस्ट किया गया एक प्रश्न दिखाई देता है, तो मुझे कम से कम एक या दो उत्तर पोस्ट होते हैं जो LINQ की समस्या को हल करते हैं। आमतौर पर बहुत उच्च प्रतिष्ठा वाले लोग पेशेवरों की तरह LINQ का उपयोग करते हैं।

तो मेरा सवाल यह है कि LINQ को किस समस्या के लिए इस्तेमाल किया जाना चाहिए?

साइड नोट्स पर भी: क्या ऐसे कोई उद्देश्य हैं जिनमें इसे टाला जाना चाहिए? क्या डेटासेट का आकार LINQ प्रश्नों के प्रदर्शन को प्रभावित करता है?


2
यहां शुरू करें: code.msdn.microsoft.com/101-LINQ-Samples-3fb9811b
Oded


1
LINQ ऑब्जेक्ट ग्राफ़ को क्वेरी करने के लिए है। यह भाषा सम्मिलित क्वेरी है - यह आपको संग्रह को क्वेरी और हेरफेर करने की अनुमति देता है।
Oded

1
इसकी शायद खड़ा के रूप में एक closable सवाल एक अच्छा सवाल क्या समस्याओं LINQ के लिए हालांकि एक अच्छा फिट है पर वहाँ में गुप्त हो सकता है
जे।

1
Linq घोषणात्मक है। आप "क्या" आप यह निर्दिष्ट किए बिना "क्या" चाहते हैं, यह बताता है। Linq के लिए इसका मतलब है कि आप जो चाहते हैं उसे बताने के लिए प्रश्नों का उपयोग कर सकते हैं। कुछ समस्याओं के लिए घोषणा कोड छोटा और आसान हो सकता है।
mike30

जवाबों:


16

LINQ को मुख्य रूप से डेटा के अनुक्रमों पर शुद्ध कार्यात्मक प्रश्नों और परिवर्तनों की अनुमति देने के लिए डिज़ाइन किया गया है (आप ध्यान देंगे कि सभी LINQ एक्सटेंशन Func प्रतिनिधियों को लेते हैं, लेकिन Action प्रतिनिधियों को नहीं)। नतीजतन एक लूप का सबसे आम मामला जो LINQ के साथ फिट नहीं होता है वह एक है जो सभी गैर-शुद्ध कार्यात्मक प्रभाव प्रभावों के बारे में है, जैसे:

foreach(var x in list) Console.WriteLine(x);

LINQ का उपयोग करने में बेहतर होने के लिए, बस इसका उपयोग करने का अभ्यास करें।

जब भी आप किसी संग्रह के साथ कुछ करने के लिए एक लूप लिखने forया लिखने वाले होते हैं foreach, रुकते हैं, तो विचार करें कि क्या यह LINQ के लिए एक अच्छा फिट है (अर्थात यह तत्वों पर केवल एक क्रिया / साइड इफेक्ट प्रदर्शन नहीं कर रहा है), और यदि ऐसा है तो अपने आप को लिखने के लिए मजबूर करें यह LINQ का उपयोग कर।

आप foreachपहले संस्करण भी लिख सकते हैं फिर एक LINQ संस्करण को फिर से लिखना।

जैसा कि svick बताता है, LINQ आपके प्रोग्राम को अधिक पठनीय बनाने के बारे में होना चाहिए। यह आमतौर पर अच्छा है क्योंकि यह तंत्र के बजाय कोड के इरादे पर जोर देता है; हालाँकि, यदि आप पाते हैं कि आप अपने प्रश्नों को एक सरल लूप से अधिक पठनीय नहीं बना सकते हैं, तो बेझिझक लूप से चिपके रहें।

यदि आपको अभ्यास करने के लिए अभ्यास की आवश्यकता है, तो अधिकांश कार्यात्मक प्रोग्रामिंग अभ्यास LINQ जैसे 99 समस्याओं (विशेष रूप से पहले 20 या तो) या परियोजना शासक को अच्छी तरह से मैप करेंगे ।


मुझे अब इस प्रश्न को हटाना पड़ सकता है। मॉडरेटर ने टिप्पणी की कि यह समुदाय के लिए फिट नहीं है .. यदि आप अन्यथा महसूस करते हैं, तो कृपया मुझे बताएं।
user1816120

1
मुझे लगता है कि यदि आप इसे LINQ में फिर से लिखते हैं और मूल अभी भी अधिक पठनीय है, तो मूल रखें और LINQ संस्करण को हटा दें। कभी-कभी, LINQ कुछ भी नहीं जोड़ता है।
svick

सिद्धांत में @svick हाँ, मुझे यकीन नहीं है कि मैं इसके किसी भी उदाहरण के बारे में सोच सकता हूँ;)
jk।

1
@jk। उदाहरण के लिए, ReSharper कभी-कभी मेरे पाश को LINQ का उपयोग करने के लिए परिवर्तित करता है Aggregate()। मुझे लगता है कि ज्यादातर समय, लूप अधिक पठनीय है।
svick

@svick शायद आप के लिए उपयोग किया जाता है की एक मुद्दा है, हालांकि मैं मानता हूँ कि कुल मिलाकर गुना के लिए एक अनाड़ी नाम है
पी।

1

संपादित प्रश्न का उत्तर देने के लिए: संक्षेप में, जब भी आपको "क्वेरी" कार्यक्षमता को लागू करना हो तो LINQ का उपयोग करना फायदेमंद होता है (कि LINQ में Q किसके लिए है)। एक सटीक डोमेन को परिभाषित करना मुश्किल है, लेकिन यह संग्रह से डेटा निकालने और हेरफेर करने से जुड़े कई कार्यों को सरल करता है।

थोड़ा विस्तार करने के लिए, बहुत सी क्वेरी कार्यक्षमता को सीधे भाषा में लाया गया है (या बल्कि, विभिन्न LINQ- कार्यान्वयनकर्ता), इसलिए एग्रीगेशन, ऑर्डरिंग, ग्रुपिंग, फ़िल्टरिंग, प्रोजेक्शन, जॉइन (और बहुत कुछ) जैसी चीजें सभी के लिए संभाला जाता है। आप। LINQ- आधारित समाधान भी आमतौर पर की तुलना में कम होते हैं यदि आप उन्हें "हाथ से" लागू करने के लिए थे, और उनके इरादे को बहुत बेहतर तरीके से संवाद करते हैं।

एक सरल उदाहरण जो अक्सर LINQ की शक्ति को व्यक्त करने में मदद करता है एक निर्देशिका की सामग्री को प्रदर्शित करने के लिए, विस्तार द्वारा समूहीकृत। अपने सिर में एक विशिष्ट अनिवार्य कार्यान्वयन के माध्यम से चलाएं - पहले से ही बहुत सारे कार्यान्वयन विवरण होंगे। शायद हम Dictionary<String, List<String>>विस्तार से फ़ाइलों को अनुक्रमित करने के लिए एक का उपयोग करेंगे । बेशक, हमें जांचना होगा कि क्या कोई कुंजी पहले से मौजूद है, एक सूची को तत्काल, इसमें जोड़ें, आदि। यह कुछ इस तरह से हो सकता है:

Dictionary<string, List<string>> fileGroups = new Dictionary<string, List<string>>();

foreach (string file in Directory.GetFiles(Environment.CurrentDirectory))
{
    string extension = Path.GetExtension(file).ToLower();

    if (!fileGroups.ContainsKey(extension))
    {
        fileGroups[extension] = new List<string>();
    }

    fileGroups[extension].Add(file);
}

LINQ समतुल्य पर विचार करें:

var query = from file in Directory.GetFiles(Environment.CurrentDirectory)
            group file by Path.GetExtension(file).ToLower();

ध्यान दें कि क्वेरी केवल 2 लाइनें हैं, निश्चित रूप से किसी भी अनिवार्य समाधान की तुलना में कम है जो हम साथ आ सकते हैं। यह भी बहुत पठनीय है; सिग्नल-टू-शोर अनुपात पहले समाधान के साथ की तुलना में अधिक है। LINQ में जो नए हैं उनके लिए, आप उस क्वेरी के परिणामों को निम्नानुसार आउटपुट करेंगे:

foreach (var fileGroup in query)
{
    Console.WriteLine(String.Format("*** Files with extension: {0}", group.Key));

    foreach (string file in fileGroup)
    {
        Console.WriteLine(file);
    }
}

अधिक जटिल उदाहरणों के साथ, मतभेद सामान्य रूप से और भी अधिक विशाल हो जाते हैं (उदाहरण के लिए, कई क्षेत्रों द्वारा समूहीकृत करने पर विचार करें)। इसलिए, संक्षेप में, LINQ कई "दिन प्रतिदिन" डेटा क्वेरी समस्याओं को एक तरह से हल करता है जो अक्सर कम और अधिक आत्म-वर्णनात्मक होता है। यह सिंटैक्स और तकनीक सीखने की मामूली लागत पर आता है, लेकिन लाभ नकारात्मक को बहुत अधिक प्रभावित करता है।


क्या आप नक्शे को वर्गीकृत करते हैं या "प्रश्नों" के रूप में मोड़ते हैं? मैं वास्तव में नहीं, लेकिन मुझे लगता है कि मैं इसे देख सकता था शायद .. मैं सामान्य रूप से एक संगणना के परिणामस्वरूप एक कुलीन के बारे में सोचूंगा, "क्वेरी" नहीं
जिमी हॉफ

@JimmyHoffa मैं ज्यादातर संग्रह के लिए अभिकलन के अनुप्रयोग की बात कर रहा हूं, जरूरी नहीं कि अभिकलन स्वयं। लेकिन मेरी सादृश्य में संभवतः अंतराल छेद हैं, यह 100% सही होने के बजाय उदाहरण के लिए है।
डैनियल बी

@JimmyHoffa नहीं, लेकिन फिर मुझे यकीन नहीं है कि अगर एक क्वेरी के साथ शुरू करने की सख्त परिभाषा है
jk।

0

विभिन्न प्रकार के डेटा स्रोतों के लिए समय के साथ विभिन्न भाषाओं को विकसित किया गया है, उदाहरण के लिए रिलेशनल डेटाबेस के लिए SQL और XML के लिए XQuery। इसलिए, डेवलपर्स को प्रत्येक प्रकार के डेटा स्रोत या डेटा प्रारूप के लिए एक नई क्वेरी भाषा सीखनी चाहिए, जिसका उन्हें समर्थन करना चाहिए। LINQ विभिन्न प्रकार के डेटा स्रोतों और प्रारूपों में डेटा के साथ काम करने के लिए एक सुसंगत मॉडल की पेशकश करके इस स्थिति को सरल बनाता है। LINQ क्वेरी में, आप हमेशा ऑब्जेक्ट्स के साथ काम कर रहे हैं। अधिक यात्रा के लिए http://msdn.microsoft.com/en-us/library/bb397906.aspx


वास्तव में LINQ संग्रह के साथ काम करने के लिए एक अमूर्त एपीआई है। कुछ महत्वपूर्ण लाभ: C # के उपयोग से आपको STATIC मिलता है! अपने प्रश्नों और परिवर्तनों का सत्यापन
एंड्रियाशेचर्टर्ट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.