C# में कार्यात्मक प्रोग्रामिंग: A से Z तक
\n\nकार्यात्मक प्रोग्रामिंग (FP) एक प्रतिमान है जो गणना को गणितीय कार्यों की गणना के रूप में मानता है और परिवर्तनीय स्थिति और दुष्प्रभावों से बचता है। हालाँकि C# ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग (OOP) के लिए मजबूत समर्थन वाली एक बहु-प्रतिमान भाषा है, इसके आधुनिक संस्करण (C# 3.0 और उसके बाद से) सक्रिय रूप से कार्यात्मक शैली के तत्वों को एकीकृत करते हैं। यह अधिक संक्षिप्त, पूर्वानुमानित और आसानी से परीक्षण योग्य कोड लिखने की अनुमति देता है।
\nइस लेख में, हम .NET के संदर्भ में C# में कार्यात्मक प्रोग्रामिंग की मूल बातों से लेकर उन्नत तकनीकों तक की यात्रा करेंगे। आप सीखेंगे कि विश्वसनीय एप्लिकेशन बनाने के लिए लैम्ब्डा एक्सप्रेशन, LINQ, अपरिवर्तनीय डेटा प्रकार और पैटर्न का उपयोग कैसे करें।
\n\n1. मूल बातें: लैम्ब्डा एक्सप्रेशन और डेलिगेट्स
\nC# में कार्यात्मक दृष्टिकोण का हृदय लैम्ब्डा एक्सप्रेशन हैं - ये अनाम फ़ंक्शन हैं जिनका उपयोग डेलिगेट या एक्सप्रेशन ट्री बनाने के लिए किया जा सकता है। वे व्यवहार को डेटा के रूप में पास करने की अनुमति देते हैं।
\nसूची को सॉर्ट करने के एक क्लासिक उदाहरण पर विचार करें। एक अलग तुलना विधि बनाने के बजाय, हम लैम्ब्डा का उपयोग करते हैं:
\n\nusing System;\nusing System.Collections.Generic;\n\npublic class LambdaExample\n{\n public static void Main()\n {\n var numbers = new List<int> { 5, 3, 8, 1, 9 };\n \n // लैम्ब्डा एक्सप्रेशन का उपयोग करके अवरोही क्रम में सॉर्ट करना\n numbers.Sort((x, y) => y.CompareTo(x));\n \n Console.WriteLine(string.Join(", ", numbers)); \n // आउटपुट: 9, 8, 5, 3, 1\n }\n}\n\nयहाँ काम करने वाली प्रमुख अवधारणाएँ:
\n- \n
- डेलिगेट्स
Func<>औरAction<>:Func<T, TResult>एक मान लौटाता है,Action<T>नहीं लौटाता। लैम्ब्डा इन प्रकारों में अंतर्निहित रूप से परिवर्तित हो जाते हैं। \n - क्लोज़र (Closures): लैम्ब्डा बाहरी दायरे से चर कैप्चर कर सकता है, जो इसे एक शक्तिशाली उपकरण बनाता है, लेकिन संभावित दुष्प्रभावों के कारण सावधानी की आवश्यकता होती है। \n
2. LINQ: डेटा के साथ काम करने की घोषणात्मक शैली
\nLanguage Integrated Query (LINQ) शायद C# में FP का सबसे प्रमुख उदाहरण है। यह मेथड चेन का उपयोग करके संग्रह, डेटाबेस और XML पर घोषणात्मक क्वेरी लिखने की अनुमति देता है।
\nअनिवार्य foreach लूप के बजाय, हम कार्यात्मक संचालन का उपयोग करते हैं:
using System;\nusing System.Linq;\nusing System.Collections.Generic;\n\npublic class LinqExample\n{\n public static void Main()\n {\n var people = new List<Person>\n {\n new Person { Name = "Alice", Age = 30 },\n new Person { Name = "Bob", Age = 17 },\n new Person { Name = "Charlie", Age = 25 }\n };\n\n // कार्यात्मक क्वेरी: फ़िल्टरिंग, प्रोजेक्शन, सॉर्टिंग\n var result = people\n .Where(p => p.Age >= 18) // फ़िल्टरिंग (प्रेडिकेट)\n .OrderBy(p => p.Name) // सॉर्टिंग\n .Select(p => new { p.Name, IsAdult = true }) // प्रोजेक्शन (अनाम प्रकार)\n .ToList();\n\n foreach (var item in result)\n {\n Console.WriteLine($"{item.Name} - Adult: {item.IsAdult}");\n }\n // आउटपुट: Alice - Adult: True, Charlie - Adult: True\n }\n\n public class Person\n {\n public string Name { get; set; }\n public int Age { get; set; }\n }\n}\n\nप्रमुख LINQ ऑपरेटर:
\n- \n
Where— फ़िल्टरिंग (filterका एनालॉग)। \n Select— रूपांतरण (mapका एनालॉग)। \n Aggregate— संकुचन (reduceका एनालॉग)। \n Any,All— शर्तों की जाँच। \n
विलंबित निष्पादन के बारे में याद रखना महत्वपूर्ण है।