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