2013-05-24 5 views

Antwort

2
var myFoos = from foo in allFoos 
      let platform = LoadPlatform(foo) 
      where platform != "BadPlatform" 
      select LoadOwner(foo); 
+0

Aber ich lade Plattformen innerhalb der Select. – pencilCake

+0

@pencilCake - Ich bin mir nicht sicher, was Sie meinen - Ihr Test ist gegen die Plattform, die Sie laden. Wie werden Sie den Zustand prüfen, ohne ihn zuerst zu laden? – Lee

1

Sie können etwas tun:

var myFoos = allFoos 
     .Select (foo => new {Platform = LoadPlatform(foo), Foo = foo}) 
     .Where(all => all.Platform != "BadPlatform") 
     .Select(all => { 
      var platform = all.Platform;//Not "BadPlatform" 
      var owner = LoadOwner(all.Foo); 
      // .... Som eother loads 
     }); 
2

Sie sollten eine Where verwenden Sie die Elemente, um herauszufiltern Sie nicht wollen. Dies ist mit Ihrem aktuellen Code nicht möglich, aber es gibt viel Platz für Refactoring. Rewrite es wie folgt aus:

var myFoos = allFoos 
    .Where(foo => LoadPlatform(foo) != "BadPlatform") 
    .Select(LoadOwner) 
    // ...continue with your other code 

Wenn die „anderen Code“ auch die Plattform Wert muss dann sollten Sie in einem anonymen Typ Projekt zuerst:

var myFoos = allFoos 
    .Select(foo => new { Platform = LoadPlatform(foo), Foo = foo }) 
    .Where(o => o.Platform != "BadPlatform") 
    .Select(o => new { Platform = o.Platform, Owner = LoadOwner(o.Foo), ... }) 
    // ...continue with your other code 

Im Allgemeinen sollten Sie Schreibblock Ausdrücke in dies vermeiden Art von Lambdas, wenn überhaupt möglich; Blockausdrücke sorgen für starren Code, der nicht so einfach zusammengesetzt werden kann.

Verwandte Themen