2013-12-13 85 views
0

我有這樣定義的結構: -如何獲得結構列表的總和?

Public Structure MyStructure 

    ' Some member variables and methods 

    Public Shared Operator +(ByVal str1 As MyStructure, ByVal str2 As MyStructure) As MyStructure 
     ' Some works 
     Return New MyStructure (some parameters) 
    End Operator 

End Structure 

,我在一個列表使用此: -

Dim my_list As List (Of MyStructure) 
' code to fill in list 

我想根據計算列表中的結構的總和定義重載的+運算符;是這樣的: -

Dim my_sum As MyStructure = my_list.Sum(Function(x) x) 

但這不起作用,因爲返回類型沒有雙,單,整數,小數,長,或其中之一的可空版本。有什麼辦法可以在Sum方法中「重載」+運算符?也許有一些接口可以實現?

編輯有人建議這是this question here的可能重複。情況並非如此;該問題要求成員變量的總和;這個問題是要求由超載的+運算符定義的總和。

+0

[VB.NET LINQ Query:獲取特定結構成員的所有值之和]的可能重複(http://stackoverflow.com/questions/1785403/vb-net-linq-query-getting-the- sum-of-all-values-for-specific-structure-member) – Monika

回答

1

好吧,這是一個冒險,但是這是我的結果:

現有的總和擴展只提供基本類型作爲結果,因此需要選擇。你發現了一個,好的。

現在下一步對我來說是寫我自己的擴展支持您的需求。

所以我正在尋找你的建議,一個接口,需要實現類有一個任何類型的操作符。 那麼沒有任何。你也不能自己定義這樣的接口,因爲操作者本質上是靜態的,不能被覆蓋。

因此,下一步是通過一個泛型類型來擴展sum,這個泛型類型將自身限制爲具有運算符的類型。

原來你不能將泛型類型約束到結構。

所以在這裏,我得到了工作

所以當我明白你想要做這樣的事情代碼:

Public Class MainClass 
    ' ... 
    Public Shared Sub Test() 
     Dim lsta As New List(Of SomeClass)(New SomeClass() { 
              New SomeClass(5, 10, 2.5), 
              New SomeClass(7, 23, 1.2) 
             } 
            ) 
     Dim sum As SomeClass = lsta.Sum(Of SomeClass)() 
    End Sub 
    ' ... 
End Class 

現在你的結構是要去必須是一流的,像這樣的:

Public Class SomeClass 
    Public Sub New(x As Int32, y As Int32, c As Double) 
     m_iX = x 
     m_iY = y 
     m_fC = c 
    End Sub 
    Private m_iX As Int32 
    Private m_iY As Int32 
    Private m_fC As Double 
    Public ReadOnly Property X 
     Get 
      Return m_iX 
     End Get 
    End Property 
    Public ReadOnly Property Y 
     Get 
      Return m_iY 
     End Get 
    End Property 
    Public ReadOnly Property C 
     Get 
      Return m_fC 
     End Get 
    End Property 

    ' Custom operator: 
    Public Shared Operator +(a As SomeClass, b As SomeClass) As SomeClass 
     Return New SomeClass(a.X + b.X, a.Y + b.Y, a.C * b.C) 
    End Operator 

    ' This is coming in handy for initializing the first element in your sum 
    Public Shared Function NeutralElement() As SomeClass 
     Return New SomeClass(0, 0, 1) 
    End Function 
End Class 

最後在這裏延伸:

Public Module ListExtension 
    <Extension()> _ 
    Public Function Sum(Of T As SomeClass)(source As IEnumerable(Of SomeClass)) As SomeClass 
     ' Note we have to constain T to SomeClass (also SomeClass cannot be a Structure :)) 
     Dim returnValue As T = SomeClass.NeutralElement() 
     For Each el As T In source 
      returnValue = returnValue + el 
     Next 
     Return returnValue 
    End Function 
End Module 

我希望這清除了一些問題,提出任何問題,並且,

...有樂趣實現它!

+0

感謝您在這裏的幫助。恰巧我需要的結構是結構(價值類型),但你的答案在將來很有用。 –