Lambda von C# in C++ CLI
-
Guten Abend zusammen
Ich hab hier ein Code con C# den ich in C++ Cli umschreiben muss.
RDAFile tAlready = CurrentReader.rdaFolder.GetAllFiles().Find(f => f.FileName == rdaDestFile);
Mit Predicate krieg ich das nicht hin und eine möglichkeit mit Lambda in C++ Cli kenn ich nicht.
Hier mal der komplette Code:
List<RDAFile> coll = new List<RDAFile>(); foreach (string file in Directory.GetFiles(dlg.SelectedPath, "*", SearchOption.AllDirectories)) { string dir = Path.GetDirectoryName(file).Replace(dlg.SelectedPath, ""); string rdadir = (CurrentReader.rdaFolder.FullPath + "\\" + dir).Trim('\\'); string rdaDestFile = RDAFile.FileNameToRDAFileName(file, rdadir); RDAFile tAlready = CurrentReader.rdaFolder.GetAllFiles().Find(f => f.FileName == rdaDestFile); if (tAlready == null) { RDAFile rdafile = RDAFile.Create(file, rdadir); if (rdafile != null) { coll.Add(rdafile); } } else { tAlready.SetFile(file, true); } } CurrentReader.rdaFolder.AddFiles(coll);
-
Der Code ist doch nicht komplett. Wichtiger als irgendwelche Codemassen wäre aber, was für eine Collection CurrentReader.rdaFolder.GetAllFiles() zurückgibt bzw. was für Elemente diese enthält.
edit: Achso, "RDAFile", was auch immer das ist. Falls keine sonst antwortet bastel ich nachher mal was.
-
genau, Find() durchsucht eine Liste (List<T>()) und das erwartet ein Predicate.
-
C++/CLI hat keine anonymen Funktionen, also musst du dir was nicht-anonymes basteln. Vielleicht so ungefähr:
ref class FileNameComparer { System::String^ reference; public: FileNameComparer(System::String^ reference) : reference(reference) { } bool FileNameIsEqual(RDAFile^ f) { return f->FileName == reference; } }; ... RDAFile^ tAlready = CurrentReader->rdaFolder->GetAllFiles()->Find( gcnew System::Predicate<RDAFile^>(gcnew FileNameComparer(rdaDestFile), &FileNameComparer::FileNameIsEqual));
Ich habs nur mit int ausprobiert und bin auch nicht so ganz der C++/CLI-Crack, aber das müsste funktionieren. Vielleicht geht es eleganter.
-
Vielen Dank es geht
Ich hatte das so ähnlich mit einem struct, jezt ist mir bewußt warum das nicht ging...
Ich hab das jezt so:
ref struct FileNameComparer { FileNameComparer(String^ str) : CompareTo(str) {} String^ CompareTo; Boolean FileNameIsEqual(RDAFile^ f) { return f->FileName == CompareTo; } }; RDAFile^ tAlready = reader->rdaFolder->GetAllFiles()->Find(gcnew System::Predicate<RDAFile^>(gcnew FileNameComparer(rdaDestFile), &FileNameComparer::FileNameIsEqual));
Oder ist eine Klasse dafür aus irgend einem Grund besser wie ein struct?
-
sensimillia schrieb:
Oder ist eine Klasse dafür aus irgend einem Grund besser wie ein struct?
Keine Ahnung. In C# macht es ja einen großen Unterschied, in C++/CLI dürfte es egal sein, weil man die Unterscheidung zwischen Referenz- und Werttypen durch das "ref"-Schlüsselwort angibt.
-
Bashar schrieb:
sensimillia schrieb:
Oder ist eine Klasse dafür aus irgend einem Grund besser wie ein struct?
Keine Ahnung. In C# macht es ja einen großen Unterschied, in C++/CLI dürfte es egal sein, weil man die Unterscheidung zwischen Referenz- und Werttypen durch das "ref"-Schlüsselwort angibt.
Der Vollständigkeit halber hier nochmals zusammengefasst:
class
undstruct
sind in C++/CLI genau wie auch in C++ gleichbedeutend. Den Unterschied machen die Attributevalue
undref
.value class
bzw.value struct
ist in C++/CLI gleichbedeutend mit C#'sstruct
;ref class
bzw.ref struct
entspricht in C#class
.