2017-01-26 2 views
1

Я пытаюсь избежать многочисленных проверок DistanceTo метода в следующей ситуации:LINQ OrderBy и где объединен

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

или

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

В любом случае я должен использовать DistanceTo методы два раза , Можно ли избежать этого в LINQ?

ответ

3

Вы можете использовать let заявление в синтаксисе запроса Linq, как это:

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

Если вы хотите использовать синтаксис метода, вам придется временно спроецировать на анонимный тип

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);