Autor Beitrag
Hawk78
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Do 22.09.11 15:01 
Hallo,

ich habe in der Suche nichts genaues dazu gefunden.

Ich habe eine Liste mit integer-Werten und möchte mit der Methode FindIndex() die Postion des ersten Wertes finden, der zu meinem Suchkriterium paßt.

ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
 List<int> liste;

 ...Liste füllen...

Predicate<int> suchen = new Predicate<int>(suchen => finde(suchen,1003));

//die Methode für die Suchfunktion
         static bool finde(int zahl,int match, int option)
             {
           
            switch (option)
            {
                case 1:         // kleiner
                    if (zahl < match)  
                        return true;
                    else
                        return false;
                    break;
                case 2:         // gleich
                    if (zahl == match)
                        return true;
                    else
                        return false;
                    break;
                case 3:         // größer
                    if (zahl > match)
                        return true;
                    else
                        return false;
                    break;
                default:
                    return false;
                    break;


            }
        }


Zum suchen rufe ich dann einfach die Methode auf:

ausblenden C#-Quelltext
1:
2:
          //Element suchen
             label1.Text = liste.FindIndex(suchen).ToString() ;


Leider weiß ich nicht, wie ich die Parameter für die Methode suchen dynamisch übergeben kann. Sobald ich Variablen für den Aufruf nutze kommt der Fehler

"Ein Feldinitialisierer kann nicht auf das nicht statische Feld bzw. die nicht statische Methode oder Eigenschaft 'GenerischeListeFormular.Form1.xx' verweisen.

Wer kann mir weiterhelfen? :(

Danke.
Gruß Hawk78

Moderiert von user profile iconChristian S.: Code- durch C#-Tags ersetzt
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4796
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Do 22.09.11 16:35 
Hallo Hawk,

du kannst den Lambda-Ausdruck direkt benutzen:
ausblenden C#-Quelltext
1:
label1.Text = liste.FindIndex(suchen => finde(suchen, 1003)).ToString();					

Und statt der Konstanten 100 dann auch eine lokale Variable benutzen.
Hawk78 Threadstarter
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Fr 23.09.11 11:16 
Hallo Th69,

danke für den Tipp. Leider funktioniert es aber mit der "Predicate" Answeisung nicht mehr.
Wenn ich folgendes nutze:

ausblenden Quelltext
1:
2:
3:
4:
5:
 Predicate<int> suchen = new Predicate<int>(suchen => finde(suchen,100, 3));
 ...

 int ax=50;
 label1.Text = liste.FindIndex(suchen => finde(suchen, ax, 3)).ToString();


...dann ignoriert er die 50 und sucht trotzdem nach >100 Werten.

Wie muß ich die Predicate-Anweisung anpassen, damit es funktioniert?
Kann man das sonst über eine eigene Klasse für Liste+Suchparameter realisieren?

Grüße
Hawk78
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4796
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Fr 23.09.11 13:04 
Hallo Hawk78,

ich habe es gerade bei mir mal ausprobiert und es funktioniert:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
void Test()
{
  List<int> liste = new List<int>();
  liste.Add(1);
  liste.Add(100);
  int ax = 50;
  int x = liste.FindIndex(suchen => finde(suchen, ax, 3));
}

static bool finde(int zahl,int match, int option)
{
  // ...
}

Intern legt der Lambda-Ausdruck eine eigene Klasse dafür an und übergibt die Werte dann als Parameter - sicherlich kann man das auch selber so machen (so wie herbivore in deinem myCSharp-Thread beschrieben hat), ist aber nur unnötige Schreibarbeit.

P.S: Das Anlegen des Predicate-Ausdrucks ist wegen dem Lambda-Ausdruck selber nicht nötig.
Hawk78 Threadstarter
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Fr 23.09.11 15:06 
Hallo Th69,

super! Vielen Dank! Jetzt habe ich es verstanden :D

Schönes Wochenende
Gruß
Hawk78