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 und struct sind in C++/CLI genau wie auch in C++ gleichbedeutend. Den Unterschied machen die Attribute value und ref . value class bzw. value struct ist in C++/CLI gleichbedeutend mit C#'s struct ; ref class bzw. ref struct entspricht in C# class .


Anmelden zum Antworten