2017-01-26 2 views
1

Ich versuche, mehrere Kontrollen von DistanceTo Methode in der folgenden Situation zu vermeiden:LINQ OrderBy und Wo kombiniert

public IEnumerable<Object> NearbyObjects => Objects.Where(o => a.DistanceTo(o) < 10).OrderBy(o => a.DistanceTo(o)); 

oder

public IEnumerable<Object> NearbyObjects => Objects.OrderBy(o => a.DistanceTo(o)).TakeWhile(o => a.DistanceTo(o) < 10); 

Auf jeden Fall habe ich DistanceTo Methode zweimal verwenden, . Ist es möglich, dies in LINQ zu vermeiden?

Antwort

3

können Sie verwenden, um die let Anweisung in Linq-Abfrage-Syntax wie folgt aus:

public IEnumerable<Object> NearbyObjects => 
    from o in Objects 
    let distanceTo = a.DistanceTo(o) 
    where distanceTo < 10 
    orderby distanceTo 
    select o; 

Wenn Sie Methode Syntax verwenden möchten, werden Sie vorübergehend auf einen anonymen Typ projizieren müssen

public IEnumerable<Object> NearbyObjects => 
    Objects.Select(o => new { o, distanceTo = a.DistanceTo(o) }) 
      .Where(o => o.distanceTo < 10) 
      .OrderBy(o => o.distanceTo) 
      .Select(o => o.o);