2014-01-13 3 views
1

У меня есть список строк, каждый из которых имеет список точек (x, y). Я хочу найти самый большой «х» во всех строках, поэтому я написал следующую функцию:Ограничение доступа как аргумент

Private Function ObtainMaxX() As Double 
    Dim maxX As Double = Double.MinValue 

    For Each l As Line In _lines 
     Dim points As List(Of Point) = l.ObtainPoints 
     For Each p As Point In points 
      If p.X > maxX Then 
       maxX = p.X 
      End If 
     Next 
    Next 

    Return maxX 

End Function 

Все работает нормально. Но теперь я хочу получить меньший «x» во всех строках. Таким образом, функция, необходимая для этого, была бы почти такой же, как и предыдущая, за исключением того, что мы изменили бы «Double.MinValue» для «Double.MaxValue» и «>» для «<».

Вы знаете какой-либо способ сделать все это проще, без дублирования кода?

Спасибо!

ответ

4

Вы можете использовать Enumerable.Min/Max, которые являются частью System.Linq имен:

Dim maxX As Double = c.ObtainLines.Select(Function(p) p.X).Max() 
Dim minX As Double = c.ObtainLines.Select(Function(p) p.X).Min() 

Таким образом, вы просто должны SelectX собственности в первую очередь.

Edit: если вы хотите, чтобы найти самый большой/маленький X в целом вы можете использовать SelectMany:

Dim allPoints = _lines.SelectMany(Function(l) l.ObtainLines) 
Dim maxX = allPoints.Select(Function(p) p.X).Max() 
Dim minX = allPoints.Select(Function(p) p.X).Min() 

один и тот же синтаксис запроса:

Dim allPointX = From line in _lines 
       From point in l.ObtainLines 
       Select point.X 
Dim maxX = allPointX.Max() 
Dim minX = allPointX.Min() 
+0

@ Гуа-Naiko-Che: ах, подождите, теперь я вижу, вы хотите найти в целом. –

+0

точно. Таким образом, с вашим подходом я все еще должен проверить, является ли результат запроса Linq больше для каждой строки ... (извините, были ошибки в первом коде, который я разместил ...) –

+0

@ Gua-naiko-che: отредактировал мой ответ. –

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