2010-03-03 5 views
14

Ich bin neu in der funktionalen Seite von C#, sorry, wenn die Frage lahm ist.Zuweisen der Eigenschaft des anonymen Typs über anonyme Methode

Angesichts der folgenden falschen Code:

var jobSummaries = from job in jobs 
        where ... 
        select new 
        { 
         ID = job.ID, 
         Description = job.Description, 
         FileName = (job) => { 
            // primitive logic not 
            // worth to become a named method 
            try { return job.Files[0].LocalName); } 
            catch { return null as string; } 
           } 
        }; 

Dieser Code erzeugt folgende gerechtfertigt Compiler-Fehler:

cannot assign lambda expression to anonymous type property

Der obige Code würde die Delegierten auf die Filename-Eigenschaft festgelegt. Aber das ist nicht mein Ziel. Ich möchte den Code so, aber ohne die Methode zu benennen:

Irgendwelche Vorschläge?

Antwort

16

direkt eine anonyme Funktion aufzurufen, dies funktioniert:

int result = new Func<int, int>((int i) =>{ return i + 5; }).Invoke(3); 
// result = 8 

Aber ich stimme, int result = (i => i + 5)(3); viel cooler = wäre)

3

Soweit ich weiß, kann man nicht Inline-Lambda-Ausdrücke wie dass, weil ein Lambda-Ausdruck eine Instanz selbst ist (vom Typ Expression<Func<T>> oder ähnlich).

Allerdings können Sie dies tun (mit der Berechnung des Dateinamen aktualisiert, da dies nun durch die OP zur Verfügung gestellt):

var jobSummaries = from job in jobs 
        where ... 
        let fileName = job.Files.Select(f => f.LocalName).FirstOrDefault() 
        select new 
        { 
         ID = job.ID, 
         Description = job.Description, 
         FileName = fileName 
        }; 

Beachten Sie die Verwendung des let Schlüsselwort, das Sie die Dateinamen extrahieren läßt von der job Variable direkt innerhalb des LINQ-Ausdrucks.

+0

Ich habe es gerade versucht. Ich kann Lambda-Ausdruck nicht als eine lokale Variable mit "Let" festlegen. Ich habe den Beispielcode aktualisiert. Ich habe einen Versuch/catch, der direkte computing erschwert. – GarbageGuy

+0

Nein, Sie können einem 'fileName' keinen Lambda-Ausdruck zuweisen. Schreiben Sie einfach den folgenden Code: 'let fileName = Path.Combine (job.Folder, job.File)' oder welche Logik Sie auch brauchen ... –

+0

Warum der anonyme Downvote? –

2

Der Compiler beschwert, weil Sie nicht Ihre Lambda-Funktion aufrufen, sind Sie es definieren. Wenn der Compiler Sie lassen würde, hätten Sie eine Eigenschaft FileName, die eine Funktion und nicht ein Wert ist.

Wenn Sie Ihre "primitive Logik" als Ausdruck schreiben können, können Sie dies direkt in die Zuweisungsanweisung schreiben.

0

Wie wäre es mit der Erweiterung für wählen. So können Sie Ihre kleine Logik innerhalb

var jobSummaries = jobs.Select(j => 
      { 
       var someVar = j + "bla"; 
       return new 
        { 
         somelogic = someVar 
        }; 

      });