Autor Beitrag
kostonstyle
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 94



BeitragVerfasst: Mi 18.08.10 09:38 
Hallo miteinander
habe eine Frage zu Array.Find, und die Definition sieht so aus
ausblenden C#-Quelltext
1:
public static T Find<T>(T[] array, Predicate<T> match);					

Predicate ist ein delegate und kann nur ein parameter mitgegeben.
ausblenden 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.
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
 foreach (FileInfo file_desti in files_desti)
            {
                FileInfo file_source = Array.Find(files_source, FindFile);

            }


ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 339
Erhaltene Danke: 20

Win 10
C# (VS 2012), C++ (VS 2012/GCC), PAWN(Notepad++), Java(NetBeans)
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 94



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4799
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: 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):
ausblenden 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 -)