Entwickler-Ecke

C# - Die Sprache - Array.Find


kostonstyle - Mi 18.08.10 09:38
Titel: Array.Find
Hallo miteinander
habe eine Frage zu Array.Find, und die Definition sieht so aus

C#-Quelltext
1:
public static T Find<T>(T[] array, Predicate<T> match);                    

Predicate ist ein delegate und kann nur ein parameter mitgegeben.

C#-Quelltext
1:
public delegate bool Predicate<in T>(T obj);                    

Ich versuche mit Array.Find Befehl ein Objekt zu finden, das ganze sieht so aus.

C#-Quelltext
1:
2:
3:
4:
5:
 foreach (FileInfo file_desti in files_desti)
            {
                FileInfo file_source = Array.Find(files_source, FindFile);

            }



C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
 private bool FindFile(FileInfo file)
        {
            if (file.Name == )
            {
                return true;
            }
            else
            {
                return false;
            }
        }

Damit möchte ich es herrausfinden, ob das Objekt file_desti in files_source vorhanden ist, files_source ein Array von Typ FileInfo. Bei der Delegate Predicate kann man nur ein Parameter miteinander, man kann also nichts vergleichen. Muss ich daher den Delegate überschreiben?

Gruss kostonstyle


Greenberet - Mi 18.08.10 09:50

Du hast den falschen Ansatz.

Dein "Predicate" wird für jedes Element in dem Array aufgerufen. In deiner Funktion sagst du dann "Das ist das gesuchte Element" ( return true) oder nicht.

Also wenn du wirklich so arbeiten willst, müsstest du eine Member Variable verwenden und diese in deiner Funktion überprüfen.



Ich persönlich würde einfach 2 foreach Schleifen verwenden.


kostonstyle - Mi 18.08.10 09:59

Delegate Predicate man kann also nicht aufmotzen? Wenn das so ist, dann löse ich mit Membervariable.

vielen dank kostonstyle


Th69 - Mi 18.08.10 10:21

Alternativ kannst du anonyme Methoden bzw. Lambda-Ausdrücke direkt benutzen (dort kannst du dann auf lokale Variablen zugreifen):

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
foreach (FileInfo file_desti in files_desti)
{
    FileInfo file_source = Array.Find(files_source, 
          delegate(FileInfo fi) { return fi.Name == file_desti.Name; } );

    // bzw. als Lambda-Ausdruck
          fi => fi.Name == file_desti.Name );
}

(ich hoffe, ich habe jetzt keinen Syntaxfehler hier reingebaut -)