2013-06-13 3 views
2

У меня есть два цикла для удаления элементов из списка. Ищу эквивалентное заявление LINQ для этих петельLINQ RemoveAll вместо циклов

for (Int32 i = points.Count - 1; i >= 0; i--) 
{ 
    for (Int32 j = touchingRects.Count - 1; j >= 0; j--) 
    { 
     if (touchingRects[j].HitTest(points[i], rect.TopEdge.Y1)) 
     { 
      points.RemoveAt(i); 
     } 
    } 
} 

До сих пор я могу это сделать, но компилятор не понимает этот код:

points.RemoveAll(p => touchingRects.Where(r => r.HitTest(p, r.TopEdge.Y1))); 

Любая помощь будет оценена.

+0

Пожалуйста, сообщите об ошибке вашего компилятора. – Guvante

ответ

6

Делегат, которого вы передаете в RemoveAll, нуждается в возвращении bool.

Я думаю, что вы, что делать это:

points.RemoveAll(p => touchingRects.Any(r => r.HitTest(p, r.TopEdge.Y1))); 

Или, возможно, это (если переменная rect фактически определяется в другом месте):

points.RemoveAll(p => touchingRects.Any(r => r.HitTest(p, rect.TopEdge.Y1))); 

Я должен отметить, что исходный код имеет потенциал для очень странного поведения. После того, как вы удалите элемент из списка в своем внутреннем цикле, вы продолжаете цикл через touchingRects с тем же индексом i. Это может привести к неожиданным результатам. Там, вероятно, должно быть break где-то, но вы, возможно, пропустили свой вопрос для краткости. В любом случае использование этого кода устраняет эту проблему.

+0

Не работает! Количество точек одинаково до и после этого утверждения. – user2483744

+0

@ user2483744 см. Мой обновленный ответ для получения дополнительной информации. –

+0

Вы правы, разрыв отсутствует. – user2483744

Смежные вопросы