2014-01-13 56 views
1

我有一個行列表,每個行都有一個點列表(x,y)。我想找到所有行中最大的「x」,所以我寫了以下功能:傳遞約束作爲參數

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.MaxValue」和「>」更改爲「Double.MinValue」爲「<」之外,這樣做所需的功能與之前的功能幾乎相同。

你知道以更簡單的方式做所有這些事情嗎?沒有代碼重複?

謝謝!

回答

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財產第一。

編輯:如果你想找到的最大/最小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枝:等等,現在我明白了,你想找到整體。 –

+0

正好。所以用你的方法,我仍然需要檢查每條線的Linq查詢結果是否更大...... (對不起,在我發佈的第一個代碼時出現了一些錯誤...) –

+0

@ Gua-naiko-che:編輯我的答案。 –