Vb.net 如何获得结构列表的总和?

Vb.net 如何获得结构列表的总和?,vb.net,Vb.net,我的结构定义如下:- 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)

我的结构定义如下:-

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)
但这不起作用,因为返回类型不是double、single、integer、decimal、long或其中一个的可空版本。在Sum方法中有没有办法“获取”重载的
+
运算符?也许需要实现一些接口


编辑有人建议这可能是的重复。事实并非如此;这个问题要求一个成员变量的和;这个问题要求求重载的
+
运算符定义的和。

好吧,这是一次冒险,但这是我的结果:

现有的Sum扩展只提供基本类型作为结果,因此需要一个选择器。你找到了,好的

现在,我的下一步是编写自己的扩展来支持您的需求

因此,我一直在寻找您建议的接口,该接口要求实现类具有任何类型的运算符。 没有了。您也不能自己定义这样的接口,因为操作符本质上是静态的,不可重写

所以下一步是通过一个泛型类型来扩展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
公共模块ListExtension
_
公共函数和(T的SomeClass)(源为IEnumerable(SomeClass))的SomeClass
'注意,我们必须将其约束为SomeClass(SomeClass不能是结构:))
Dim returnValue为T=SomeClass.NeutralElement()
对于源中的每个el As T
returnValue=returnValue+el
下一个
返回值
端函数
端模块
我希望这能解决一些问题,提出任何问题


。。。享受实现它的乐趣

谢谢你的帮助,可能是重复的。碰巧我的结构需要是结构(值类型),但您的答案在将来可能会很有用。