Laden...

Aufruf von "Predicate<>" als Parameter einer Funktion

Erstellt von Bradley vor 7 Jahren Letzter Beitrag vor 7 Jahren 1.707 Views
B
Bradley Themenstarter:in
153 Beiträge seit 2014
vor 7 Jahren
Aufruf von "Predicate<>" als Parameter einer Funktion

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

Der nicht aufrufbare Member "Predicate<T>" kann nicht wie eine Methode verwendet werden.

Ich steh da gerade einfach auf dem Schlauch.

[Space Opera Blog](http://bradley-software.blogspot.com/)
[Space Opera Forum](http://forum.bradley-labs.de/)
P
441 Beiträge seit 2014
vor 7 Jahren

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

R
228 Beiträge seit 2013
vor 7 Jahren

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'));

16.807 Beiträge seit 2008
vor 7 Jahren

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

Ansonsten sei gesagt, dass Exception Handling anders funktioniert.

2.078 Beiträge seit 2012
vor 7 Jahren

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);
B
Bradley Themenstarter:in
153 Beiträge seit 2014
vor 7 Jahren

Super vielen dank an alle das hilft mir sehr 😃

[Space Opera Blog](http://bradley-software.blogspot.com/)
[Space Opera Forum](http://forum.bradley-labs.de/)