Yanıtlar:
Bir yüklem, true
veya döndüren bir işlevdir false
. Bir yüklem temsilcisi, bir yüklem için bir referanstır.
Temel olarak bir yüklem temsilcisi, true
veya döndüren bir işleve başvurudır false
. Tahminler bir değerler listesini filtrelemek için çok kullanışlıdır - işte bir örnek.
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;
}
}
Şimdi C # 3 kullanıyorsanız yüklemi daha temiz bir şekilde temsil etmek için bir lambda kullanabilirsiniz:
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
sahip return
değil yield return
o çünkü FindAll
sizin için sırasını işleyen yöntemi.
i > val
yerine, i > 2
nerede, val
değer kullanıcı tarafından girilir.
Andrew'un c # 2 ve c # 3 ile ilgili cevabından yola çıkarak ... bunları bir kerelik arama işlevi için satır içi de yapabilirsiniz (aşağıya bakın).
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;
});
}
}
Bu yardımcı olur umarım.
Sadece bir boole döndüren bir temsilci. Filtreleme listelerinde çok kullanılır, ancak istediğiniz yerde kullanılabilir.
List<DateRangeClass> myList = new List<DateRangeClass<GetSomeDateRangeArrayToPopulate);
myList.FindAll(x => (x.StartTime <= minDateToReturn && x.EndTime >= maxDateToReturn):
Burada tahminlerle ilgili iyi bir makale var , ancak .NET2 döneminden olmasına rağmen, orada lambda ifadelerinden bahsedilmiyor.
Tahmin Temsilcisi nedir?
1) Predicate, true veya false döndüren bir özelliktir. Bu kavram .net 2.0 çerçevesinde gelmiştir. 2) Lambda ifadesi ile kullanılır (=>). Genel türü bağımsız değişken olarak alır. 3) Bir yüklem fonksiyonunun tanımlanmasını ve başka bir fonksiyona parametre olarak iletilmesini sağlar. 4) Özel bir durumdur, Func
çünkü sadece tek bir parametre alır ve her zaman bir bool döndürür.
C # ad alanında:
namespace System
{
public delegate bool Predicate<in T>(T obj);
}
Sistem ad alanında tanımlanır.
Predicate Delegate'i nerede kullanmalıyız?
Predicate Delegate'i aşağıdaki durumlarda kullanmalıyız:
1) Genel bir koleksiyondaki öğeleri aramak için. Örneğin
var employeeDetails = employees.Where(o=>o.employeeId == 1237).FirstOrDefault();
2) Kodu kısaltan ve true veya false döndüren temel örnek:
Predicate<int> isValueOne = x => x == 1;
şimdi, yukarıdaki yukarıdaki çağrı:
Console.WriteLine(isValueOne.Invoke(1)); // -- returns true.
3) Predicate delege tipine aşağıdaki gibi anonim bir yöntem de atanabilir:
Predicate<string> isUpper = delegate(string s) { return s.Equals(s.ToUpper());};
bool result = isUpper("Hello Chap!!");
Tahminlerle ilgili en iyi uygulamalar var mı?
Tahminler yerine Func, Lambda İfadeleri ve Temsilciler kullanın.
Yüklemeye dayalı arama yöntemleri, belirli bir öğenin "eşleşme" olup olmadığına karar vermesi için bir yöntem delegesi veya lambda ifadesinin kullanılmasına izin verir. Bir yüklem basitçe bir nesneyi kabul eden ve doğru veya yanlış döndüren bir delegedir: genel delege bool Tahmin (T nesnesi);
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'da (VS2008) iseniz, yüklem karmaşık bir işlev olabilir:
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
Ya da tek bir ifade olduğu sürece yükleminizi lambda olarak yazabilirsiniz:
Dim list As New List(Of Integer)(New Integer() {1, 2, 3})
Dim newList = list.FindAll(Function(item) item > 2)
Tahmin, C # 'daki genel delegeler kategorisine girer. Bu bir argümanla çağrılır ve her zaman boole türü döndürülür. Temel olarak, yüklem durumu test etmek için kullanılır - doğru / yanlış. Birçok sınıf yüklemi argüman olarak destekler. Örneğin list.findall, predicate parametresini bekler. İşte yüklemin bir örneği.
İmzalı bir işlev işaretçisi düşünün -
bool delegesi myDelegate (T maçı);
İşte örnek
Node.cs
namespace PredicateExample
{
class Node
{
public string Ip_Address { get; set; }
public string Node_Name { get; set; }
public uint Node_Area { get; set; }
}
}
Ana sınıf -
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();
}
}
}
Basitçe -> çoğunlukla sorgulama için kullanılan koşula göre Doğru / Yanlış değerleri sağlarlar. çoğunlukla delegelerle kullanılır
liste örneğini ele alalım
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));
isimler ve yaşlar içerir. Şimdi diyelim ki kullanacağım şartıyla isimler bulmak istiyoruz,
Predicate<Program> test = delegate (Program p) { return p.age > 3; };
List<Program> matches = blabla.FindAll(test);
Action<Program> print = Console.WriteLine;
matches.ForEach(print);
Basit Tutmaya çalıştı!
Temsilci, bir yöntemi belirli bir imzayla kapsüllemek için kullanılabilecek bir başvuru türü tanımlar. C # temsilci Yaşam döngüsü: C # temsilci yaşam döngüsü
daha fazla bilgi edinin http://asp-net-by-parijat.blogspot.in/2015/08/what-is-delegates-in-c-how-to-declare.html
yeild return
bunun yerine mi? Veya bu nasıl çalışır, listenin tamamında nasıl yinelenir?