Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Aufruf von "Predicate<>" als Parameter einer Funktion
Bradley
myCSharp.de - Member



Dabei seit:
Beiträge: 155

Themenstarter:

Aufruf von "Predicate<>" als Parameter einer Funktion

beantworten | zitieren | melden

Hallo,

in meinem Lehrgang wird gerade das Thema Lambda-Operatoren und LINQ behandelt.
Dabei wird folgende Methode einmal als beispiel verwendet:

        List<string> CityFilter(Predicate<string> filter)
        {
            List<string> returnList = new List<string>();

            if (cityList != null)
            {
                foreach (string city in cityList)
                {
                    if(filter(city))
                    {
                        returnList.Add(city);
                    }
                }
            }
            else
            {
                Console.WriteLine("FEHLER: Die Cityliste wurde nicht erzeugt");
            }

            return returnList;
        }

Mir ist zwar klar was diese Methode tun soll, nämlich eine Liste mit Namen durchsuchen und diese wiederum in einer anderen Liste wieder ausgeben, gefiltert nach einem Suchkriterium.
Mit ist aber ein Rätsel wie ich diese Methode überhaupt aufrufe.

Ich hatte es damit probiert:

program.CityFilter(Predicate<string>("Stuttgart"));

Nur bringt mir dann der Compiler folgende Meldung:
Fehler
Der nicht aufrufbare Member "Predicate<T>" kann nicht wie eine Methode verwendet werden.

Ich steh da gerade einfach auf dem Schlauch.
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Bradley am .
private Nachricht | Beiträge des Benutzers
Papst
myCSharp.de - Experte



Dabei seit:
Beiträge: 406
Herkunft: Kassel

beantworten | zitieren | melden

Hi,

du musst das Predicate mittels eines Lambda Ausdrucks oder einer Methode definieren.
Ein Predicate ist nichts anderes, als eine (anonyme) Methode oder Funktion, die einen bool-Wert zurück gibt.


Predicate<string> predicate = (filter) => filter == "..";
Das Predicate, welches in der Variable "predicate" gespeichert ist, gibt genau dann true zurück, wenn das übergebene String-Objekt den Inhalt ".." hat.

In deinem Fall wäre also richtig (Vermute ich aus deinem Text):


program.CityFiler(city => city == "Stuttgart");
private Nachricht | Beiträge des Benutzers
Rioma
myCSharp.de - Member



Dabei seit:
Beiträge: 228

beantworten | zitieren | melden

Die Verwendung von einem Predicate lässt sich eigentlich sehr gut nachlesen. Ein Predicate ist für gewöhnlich ein delegate vom Typ Func<T,bool>.

Die Frage ist also, wie kann ich einen delegate definieren und an eine Methode übergeben.


   // 1)
            Predicate<string> myFilter2 = delegate (string city) { return city.Contains('A'); };
            CityFilter(myFilter2);

            // 2)
            Predicate<string> myFilter = city => city.Contains('A');
            CityFilter(myFilter);

            // 3)
            CityFilter(city => city.Contains('A'));
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 16234

beantworten | zitieren | melden

Je nachdem via Expression<Func<T, bool>> oder Func<T, bool>.

Ansonsten sei gesagt, dass Exception Handling anders funktioniert.
- performance is a feature -

Microsoft MVP - @Website - @blog - @AzureStuttgart - github.com/BenjaminAbt
private Nachricht | Beiträge des Benutzers
Palladin007
myCSharp.de - Member

Avatar #avatar-4140.png


Dabei seit:
Beiträge: 1551
Herkunft: Düsseldorf

beantworten | zitieren | melden

Oder einfach als Methode.
Die muss dann natürlich die Vorgaben erfüllen, beim Redicate<string> also z.B. so:

private bool FilterCityForA(string city)
{
    return city.Contains('A');
}

Die Methode kannst Du dann so wie sie ist einer anderen Methode als Parameter übergeben:

CityFilter(FilterCityForA);
Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von Palladin007 am .
private Nachricht | Beiträge des Benutzers
Bradley
myCSharp.de - Member



Dabei seit:
Beiträge: 155

Themenstarter:

beantworten | zitieren | melden

Super vielen dank an alle das hilft mir sehr :)
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Bradley am .
private Nachricht | Beiträge des Benutzers