2013-05-24 12 views

Odpowiedz

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

Ale ładuję platformy w ramach Select. – pencilCake

+0

@pencilCake - Nie jestem pewien, co masz na myśli - Twój test jest niezgodny z platformą, którą ładujesz. Jak sprawdzić stan bez wcześniejszego załadowania? – Lee

1

może zrobić coś takiego:

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

Należy użyć Where odfiltrować elementy, których nie chcesz. Nie jest to możliwe z aktualnym kodem, ale jest wiele miejsca na refaktoryzację. Przepisz to tak:

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

Jeśli „drugi kod” musi również wartość platformy wtedy należy rzutować na typ anonimowy pierwszy:

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 

Generalnie należy unikać pisania wyrażeń blokowych w tym rodzaj lambdas jeśli w ogóle możliwy; wyrażenia blokowe składają się na sztywny kod, którego nie można tak łatwo skomponować.

Powiązane problemy