जवाबों:
एक विधेय एक फ़ंक्शन है जो रिटर्न करता है true
या false
। एक विधेय प्रतिनिधि एक विधेय का संदर्भ है।
इसलिए मूल रूप से एक विधेय प्रतिनिधि एक फ़ंक्शन का संदर्भ है जो वापस लौटता है true
या false
। मूल्यों की सूची को छानने के लिए Predicates बहुत उपयोगी हैं - यहां एक उदाहरण है।
using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
List<int> list = new List<int> { 1, 2, 3 };
Predicate<int> predicate = new Predicate<int>(greaterThanTwo);
List<int> newList = list.FindAll(predicate);
}
static bool greaterThanTwo(int arg)
{
return arg > 2;
}
}
अब यदि आप C # 3 का उपयोग कर रहे हैं, तो आप एक क्लीनर फैशन में विधेय का प्रतिनिधित्व करने के लिए एक लैम्ब्डा का उपयोग कर सकते हैं:
using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
List<int> list = new List<int> { 1, 2, 3 };
List<int> newList = list.FindAll(i => i > 2);
}
}
greaterThanTwo
है return
नहीं yield return
, क्योंकि यह है FindAll
विधि है कि आप के लिए अनुक्रम से निपटने है।
i > val
, इसके बजाय i > 2
, जहां val
उपयोगकर्ता द्वारा दर्ज किया गया मान है।
एंड्रयू के जवाब से सी # 2 और सी # 3 के संबंध में अग्रणी ... आप उन्हें एक बंद खोज फ़ंक्शन के लिए इनलाइन भी कर सकते हैं (नीचे देखें)।
using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
List<int> list = new List<int> { 1, 2, 3 };
List<int> newList = list.FindAll(delegate(int arg)
{
return arg> 2;
});
}
}
उम्मीद है की यह मदद करेगा।
बस एक प्रतिनिधि जो एक बूलियन लौटाता है। इसका उपयोग सूचियों को फ़िल्टर करने में बहुत किया जाता है, लेकिन जहाँ भी आप चाहें उपयोग कर सकते हैं।
List<DateRangeClass> myList = new List<DateRangeClass<GetSomeDateRangeArrayToPopulate);
myList.FindAll(x => (x.StartTime <= minDateToReturn && x.EndTime >= maxDateToReturn):
यहाँ पर एक अच्छा लेख लिखा है , हालाँकि यह .NET2 युग से है, इसलिए इसमें लैम्बडा के भावों का कोई उल्लेख नहीं है।
क्या है प्रेडीकेट डेलीगेट?
1) विधेय एक विशेषता है जो सही या गलत है। यह अवधारणा .net 2.0 ढांचे में आ गई है। 2) इसका उपयोग लंबोदर अभिव्यक्ति (=>) के साथ किया जा रहा है। यह एक तर्क के रूप में सामान्य प्रकार लेता है। 3) यह एक समर्पित फ़ंक्शन को दूसरे फ़ंक्शन के पैरामीटर के रूप में परिभाषित और पारित करने की अनुमति देता है। 4) यह एक विशेष मामला है Func
, इसमें यह केवल एक पैरामीटर लेता है और हमेशा एक बूल लौटाता है।
C # नामस्थान में:
namespace System
{
public delegate bool Predicate<in T>(T obj);
}
इसे सिस्टम नेमस्पेस में परिभाषित किया गया है।
हमें Predicate प्रतिनिधि का उपयोग कहाँ करना चाहिए?
हमें निम्नलिखित मामलों में विधेय प्रतिनिधि का उपयोग करना चाहिए:
1) एक सामान्य संग्रह में आइटम खोजने के लिए। जैसे
var employeeDetails = employees.Where(o=>o.employeeId == 1237).FirstOrDefault();
2) मूल उदाहरण जो कोड को छोटा करता है और सही या गलत लौटाता है:
Predicate<int> isValueOne = x => x == 1;
अब, उपर्युक्त पर कॉल करें:
Console.WriteLine(isValueOne.Invoke(1)); // -- returns true.
3) एक अनाम विधि को नीचे के रूप में एक समर्पित प्रतिनिधि प्रकार को भी सौंपा जा सकता है:
Predicate<string> isUpper = delegate(string s) { return s.Equals(s.ToUpper());};
bool result = isUpper("Hello Chap!!");
भविष्यवाणी के बारे में कोई सर्वोत्तम प्रथा?
प्रिकेट्स के बजाय फंक, लैंबडा एक्सप्रेशन और डेलिगेट्स का उपयोग करें।
समर्पित-आधारित खोज विधियाँ एक विधि प्रतिनिधि या लैम्ब्डा अभिव्यक्ति को यह तय करने की अनुमति देती हैं कि क्या कोई दिया गया तत्व "मैच" है। एक विधेय केवल एक प्रतिनिधि होता है जो किसी वस्तु को स्वीकार करता है और सही या गलत लौटाता है: सार्वजनिक प्रतिनिधि बूल Predicate (T object);
static void Main()
{
string[] names = { "Lukasz", "Darek", "Milosz" };
string match1 = Array.Find(names, delegate(string name) { return name.Contains("L"); });
//or
string match2 = Array.Find(names, delegate(string name) { return name.Contains("L"); });
//or
string match3 = Array.Find(names, x => x.Contains("L"));
Console.WriteLine(match1 + " " + match2 + " " + match3); // Lukasz Lukasz Lukasz
}
static bool ContainsL(string name) { return name.Contains("L"); }
यदि आप VB 9 (VS2008) में हैं, तो एक विधेय एक जटिल कार्य हो सकता है:
Dim list As New List(Of Integer)(New Integer() {1, 2, 3})
Dim newList = list.FindAll(AddressOf GreaterThanTwo)
...
Function GreaterThanTwo(ByVal item As Integer) As Boolean
'do some work'
Return item > 2
End Function
या आप अपने विधेय को लंबोदर के रूप में लिख सकते हैं, जब तक कि यह केवल एक अभिव्यक्ति है:
Dim list As New List(Of Integer)(New Integer() {1, 2, 3})
Dim newList = list.FindAll(Function(item) item > 2)
प्रेडिकेट C # में सामान्य प्रतिनिधियों की श्रेणी में आता है। इसे एक तर्क के साथ कहा जाता है और हमेशा बूलियन प्रकार वापस करते हैं। मूल रूप से, स्थिति का परीक्षण करने के लिए विधेय का उपयोग किया जाता है - सच / गलत। कई वर्ग तर्क के रूप में विधेय का समर्थन करते हैं। उदाहरण के लिए list.findall पैरामीटर की भविष्यवाणी की अपेक्षा करता है। यहाँ विधेय का एक उदाहरण दिया गया है।
हस्ताक्षर के साथ एक फ़ंक्शन पॉइंटर की कल्पना करें -
बूल प्रतिनिधि myDelegate (टी मैच);
यहाँ उदाहरण है
Node.cs
namespace PredicateExample
{
class Node
{
public string Ip_Address { get; set; }
public string Node_Name { get; set; }
public uint Node_Area { get; set; }
}
}
मुख्य वर्ग -
using System;
using System.Threading;
using System.Collections.Generic;
namespace PredicateExample
{
class Program
{
static void Main(string[] args)
{
Predicate<Node> backboneArea = Node => Node.Node_Area == 0 ;
List<Node> Nodes = new List<Node>();
Nodes.Add(new Node { Ip_Address = "1.1.1.1", Node_Area = 0, Node_Name = "Node1" });
Nodes.Add(new Node { Ip_Address = "2.2.2.2", Node_Area = 1, Node_Name = "Node2" });
Nodes.Add(new Node { Ip_Address = "3.3.3.3", Node_Area = 2, Node_Name = "Node3" });
Nodes.Add(new Node { Ip_Address = "4.4.4.4", Node_Area = 0, Node_Name = "Node4" });
Nodes.Add(new Node { Ip_Address = "5.5.5.5", Node_Area = 1, Node_Name = "Node5" });
Nodes.Add(new Node { Ip_Address = "6.6.6.6", Node_Area = 0, Node_Name = "Node6" });
Nodes.Add(new Node { Ip_Address = "7.7.7.7", Node_Area = 2, Node_Name = "Node7" });
foreach( var item in Nodes.FindAll(backboneArea))
{
Console.WriteLine("Node Name " + item.Node_Name + " Node IP Address " + item.Ip_Address);
}
Console.ReadLine();
}
}
}
बस -> वे क्वेरी के लिए उपयोग की जाने वाली शर्त के आधार पर ट्रू / गलत मान प्रदान करते हैं। ज्यादातर प्रतिनिधियों के साथ प्रयोग किया जाता है
सूची का उदाहरण देखें
List<Program> blabla= new List<Program>();
blabla.Add(new Program("shubham", 1));
blabla.Add(new Program("google", 3));
blabla.Add(new Program("world",5));
blabla.Add(new Program("hello", 5));
blabla.Add(new Program("bye", 2));
नाम और उम्र शामिल हैं। अब कहते हैं कि हम शर्त पर नाम ढूंढना चाहते हैं इसलिए मैं उपयोग करूंगा,
Predicate<Program> test = delegate (Program p) { return p.age > 3; };
List<Program> matches = blabla.FindAll(test);
Action<Program> print = Console.WriteLine;
matches.ForEach(print);
इसे सरल रखने की कोशिश की!
एक प्रतिनिधि एक संदर्भ प्रकार को परिभाषित करता है जिसका उपयोग किसी विशिष्ट हस्ताक्षर के साथ एक विधि को संक्षिप्त करने के लिए किया जा सकता है। C # डेलीगेट जीवन चक्र: C # डेलीगेट का जीवन चक्र है
अधिक जानें फॉर्म http://asp-net-by-parijat.blogspot.in/2015/08/what-is-delegates-in-c-how-to-declare.html
yeild return
इसके बजाय होना चाहिए ? या यह कैसे काम करता है, यह पूरी सूची पर कैसे पुनरावृत्त करता है?