Arrays 如何对结构数组求和?

Arrays 如何对结构数组求和?,arrays,vb.net,operator-overloading,Arrays,Vb.net,Operator Overloading,我正在创建定义的结构数组,当为了这个问题而剥离到要点时,如下所示:- Public Structure MyStruct Public innards As Double Public Shared Operator +(ByVal example1 As MyStruct, ByVal example2 As MyStruct) As MyStruct Dim out_struct As MyStruct out_struct.innards

我正在创建定义的结构数组,当为了这个问题而剥离到要点时,如下所示:-

Public Structure MyStruct

    Public innards As Double

    Public Shared Operator +(ByVal example1 As MyStruct, ByVal example2 As MyStruct) As MyStruct
        Dim out_struct As MyStruct
        out_struct.innards = example1.innards + example2.innards
        Return out_struct
    End Operator

End Structure
然后我设置了一个数组:-

Dim my_struct1 As MyStruct
Dim my_struct2 As MyStruct
Dim my_struct3 As MyStruct

my_struct1.innards = 1
my_struct2.innards = 2
my_struct3.innards = 3

Dim my_struct_array() As MyStruct = {my_struct1, my_struct2, my_struct3}
我想计算数组中元素的总和:-

Dim my_total As MyStruct
my_total = my_struct_array.Sum
但这会导致编译错误:-

重载解析失败,因为没有可访问的“Sum”接受此选项 参数的数量


有什么办法可以让它工作吗?我必须实现的一些接口?或者我必须求助于LINQ吗?

因为它是一个
结构
并且具有底层类型,有一种方法可以通过谓词来实现,该谓词将告诉循环要对
求和的属性<如果您试图获取所有内部
的值,则code>my_total
是错误的类型

Dim my_total = my_struct_array.Sum(Function(ms) ms.innards)

由于它是一个
结构
,并且具有底层类型,因此有一种方法可以使用谓词来实现,该谓词将告诉循环要对
求和的属性<如果您试图获取所有内部
的值,则code>my_total
是错误的类型

Dim my_total = my_struct_array.Sum(Function(ms) ms.innards)
根据定义,
Sum()
方法需要一个参数,并且返回值的类型为
Double
,这意味着它无法计算您的结构。你必须让它计算里面的值

试着这样做:

Dim my_total As MyStruct
my_total.innards = my_struct_array.Sum(Function(ms) ms.innards)
t = MyStruct.Sum(my_struct_array)
Public Structure MyStruct
    Private ReadOnly m_value As Double

    Public Sub New (value as Double)
        m_value = value
    End Sub

    Public ReadOnly Property Value() As Double
        Get
            Return m_value
        End Get
    End Property

    Public Shared Operator +(ByVal x As MyStruct, ByVal y As MyStruct) As MyStruct
        Return New MyStruct(x.m_value + y.m_value)
    End Operator
End Structure
根据定义,
Sum()
方法需要一个参数,并且返回值的类型为
Double
,这意味着它无法计算您的结构。你必须让它计算里面的值

试着这样做:

Dim my_total As MyStruct
my_total.innards = my_struct_array.Sum(Function(ms) ms.innards)
t = MyStruct.Sum(my_struct_array)
Public Structure MyStruct
    Private ReadOnly m_value As Double

    Public Sub New (value as Double)
        m_value = value
    End Sub

    Public ReadOnly Property Value() As Double
        Get
            Return m_value
        End Get
    End Property

    Public Shared Operator +(ByVal x As MyStruct, ByVal y As MyStruct) As MyStruct
        Return New MyStruct(x.m_value + y.m_value)
    End Operator
End Structure
在纯旧版:)vb.net中,您可以尝试

Dim my_total As MyStruct
For Each item As MyStruct In my_struct_array
    my_total.innards = my_total.innards + item.innards
Next
在纯旧版:)vb.net中,您可以尝试

Dim my_total As MyStruct
For Each item As MyStruct In my_struct_array
    my_total.innards = my_total.innards + item.innards
Next

数组没有
Sum
函数,但可以使用LINQ;但是,LINQ看不到+运算符,因为它只适用于预定义的数字类型

Dim my_total As double
my_total = my_struct_array.Sum(Function(x) x.innards)
仅当您明确使用MyStructs时,+运算符才起作用:

Dim t As MyStruct = my_struct1 + my_struct2

您可以定义共享的
Sum
函数或扩展方法。这是一个
求和
函数

Public Shared Function Sum(items As IEnumerable(Of MyStruct)) as MyStruct
    Dim total as double

    For Each x In items
        total += x.innards
    Next
    dim t as New MyStruct
    t.innards = total
    Return t
End Function
这样称呼它:

Dim my_total As MyStruct
my_total.innards = my_struct_array.Sum(Function(ms) ms.innards)
t = MyStruct.Sum(my_struct_array)
Public Structure MyStruct
    Private ReadOnly m_value As Double

    Public Sub New (value as Double)
        m_value = value
    End Sub

    Public ReadOnly Property Value() As Double
        Get
            Return m_value
        End Get
    End Property

    Public Shared Operator +(ByVal x As MyStruct, ByVal y As MyStruct) As MyStruct
        Return New MyStruct(x.m_value + y.m_value)
    End Operator
End Structure

作为扩展方法:

Public Module MyExtensions
    <Extension()>
    Public Function Sum(items As IEnumerable(Of MyStruct)) as MyStruct
        Dim total as double

        For Each x In items
            total += x.innards
        Next
        dim t as New MyStruct
        t.innards = total
        Return t
    End Function
End Module

还有一件事:结构应该是不可变的。原因是,当您访问集合中的结构值时,总是会获得结构的副本,而不是引用。如果您这样做:

my_struct_list(2).innards = 100
。。。你不会得到预期的结果!列表索引器返回列表中结构的副本,然后更改此副本的
内部
字段,但列表中的结构不会更改

因此,创建如下结构:

Dim my_total As MyStruct
my_total.innards = my_struct_array.Sum(Function(ms) ms.innards)
t = MyStruct.Sum(my_struct_array)
Public Structure MyStruct
    Private ReadOnly m_value As Double

    Public Sub New (value as Double)
        m_value = value
    End Sub

    Public ReadOnly Property Value() As Double
        Get
            Return m_value
        End Get
    End Property

    Public Shared Operator +(ByVal x As MyStruct, ByVal y As MyStruct) As MyStruct
        Return New MyStruct(x.m_value + y.m_value)
    End Operator
End Structure
这个结构是不可变的。一旦使用
New(initialValue)
对值进行初始化,则无法更改该值。如果要更改列表中的值,需要执行以下操作:

my_struct_list(2) = New MyStruct(100)

这将按预期运行。

数组没有
Sum
函数,但可以使用LINQ;但是,LINQ看不到+运算符,因为它只适用于预定义的数字类型

Dim my_total As double
my_total = my_struct_array.Sum(Function(x) x.innards)
仅当您明确使用MyStructs时,+运算符才起作用:

Dim t As MyStruct = my_struct1 + my_struct2

您可以定义共享的
Sum
函数或扩展方法。这是一个
求和
函数

Public Shared Function Sum(items As IEnumerable(Of MyStruct)) as MyStruct
    Dim total as double

    For Each x In items
        total += x.innards
    Next
    dim t as New MyStruct
    t.innards = total
    Return t
End Function
这样称呼它:

Dim my_total As MyStruct
my_total.innards = my_struct_array.Sum(Function(ms) ms.innards)
t = MyStruct.Sum(my_struct_array)
Public Structure MyStruct
    Private ReadOnly m_value As Double

    Public Sub New (value as Double)
        m_value = value
    End Sub

    Public ReadOnly Property Value() As Double
        Get
            Return m_value
        End Get
    End Property

    Public Shared Operator +(ByVal x As MyStruct, ByVal y As MyStruct) As MyStruct
        Return New MyStruct(x.m_value + y.m_value)
    End Operator
End Structure

作为扩展方法:

Public Module MyExtensions
    <Extension()>
    Public Function Sum(items As IEnumerable(Of MyStruct)) as MyStruct
        Dim total as double

        For Each x In items
            total += x.innards
        Next
        dim t as New MyStruct
        t.innards = total
        Return t
    End Function
End Module

还有一件事:结构应该是不可变的。原因是,当您访问集合中的结构值时,总是会获得结构的副本,而不是引用。如果您这样做:

my_struct_list(2).innards = 100
。。。你不会得到预期的结果!列表索引器返回列表中结构的副本,然后更改此副本的
内部
字段,但列表中的结构不会更改

因此,创建如下结构:

Dim my_total As MyStruct
my_total.innards = my_struct_array.Sum(Function(ms) ms.innards)
t = MyStruct.Sum(my_struct_array)
Public Structure MyStruct
    Private ReadOnly m_value As Double

    Public Sub New (value as Double)
        m_value = value
    End Sub

    Public ReadOnly Property Value() As Double
        Get
            Return m_value
        End Get
    End Property

    Public Shared Operator +(ByVal x As MyStruct, ByVal y As MyStruct) As MyStruct
        Return New MyStruct(x.m_value + y.m_value)
    End Operator
End Structure
这个结构是不可变的。一旦使用
New(initialValue)
对值进行初始化,则无法更改该值。如果要更改列表中的值,需要执行以下操作:

my_struct_list(2) = New MyStruct(100)
这将按预期进行。

列出(我的结构)并使用

ListOfMyStruct.Sum(Function(x) x.innards)
列出(我的结构)并使用

ListOfMyStruct.Sum(Function(x) x.innards)

它产生了双重效果,而不是我的结构。以为这就是他想要的吗?把我的总效果降低为我的结构。所以没有。哇,我们几乎写了完全相同的代码,只是你更快了。:)它产生了双重效果,而不是我的结构。以为这就是他想要的吗?把我的总效果降低为我的结构。所以没有。哇,我们几乎写了完全相同的代码,只是你更快了。:)