C # Delegeleri Tahmin Et


256

Bana açıklayabilir misin:

  • Tahmin Temsilcisi nedir?
  • Tahminleri nerede kullanmalıyız?
  • Tahminleri kullanırken en iyi uygulamalar var mı?

Açıklayıcı kaynak kodu takdir edilecektir.

Yanıtlar:


319

Bir yüklem, trueveya 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, trueveya 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);
    }
}

@Andrew Hare: ilk kod snippet'inizde, yeild returnbunun yerine mi? Veya bu nasıl çalışır, listenin tamamında nasıl yinelenir?
VoodooChild

5
@VoodooChild: yüklem dizisindeki her element için adı verilecek unutmayın sırayla . Yani greaterThanTwosahip returndeğil yield returno çünkü FindAllsizin için sırasını işleyen yöntemi.
Andrew Hare

1
@AndrewHare, bu sahip olmak mümkündür i > valyerine, i > 2nerede, valdeğer kullanıcı tarafından girilir.
Mourya

81

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.


11

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):

9

Burada tahminlerle ilgili iyi bir makale var , ancak .NET2 döneminden olmasına rağmen, orada lambda ifadelerinden bahsedilmiyor.


Cevabınızdaki bağlantı artık gerçek bir makaleye bağlantı vermiyor
David Cram

@David Cram: Teşekkürler, makale günümüzde gerçekten tarihli görünse de Wayback Machine'i kullanmak için bağlantıyı güncelledim .
LukeH

6

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.


5

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"); }

2

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)

0

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();
        }
    }
}

0

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ı!


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.