VB.NET集合添加元素被覆盖问题求助
问题原因
你只在循环外创建了一个BGConstants.SPECIES实例spec,每次循环只是修改这个实例的属性值,再把同一个实例添加到集合中。因为集合存储的是对象引用,所有元素指向的都是同一个内存对象,最终所有元素都会显示最后一次循环赋值的结果。
解决方案
方案1:将对象创建移到循环内部
每次循环都新建一个SPECIES实例,这样添加到集合的是不同的对象引用:
Public Class SPECIES Public Property SPECIESDESC As String Public Property SPECIESCOUNT As Integer End Class Dim speciesSpec As New List(Of BGConstants.SPECIES) Dim result = bgFiles.GroupBy(Function(r) r.SPECIES_TYPE_ID) For Each r In result ' 每次循环新建一个SPECIES实例 Dim spec As New BGConstants.SPECIES() spec.SPECIESDESC = r.Key.ToString spec.SPECIESCOUNT = r.Count speciesSpec.Add(spec) Next
方案2:使用LINQ直接转换(更简洁)
利用LINQ的Select方法直接将分组结果转换成SPECIES对象集合,不需要手动循环:
Public Class SPECIES Public Property SPECIESDESC As String Public Property SPECIESCOUNT As Integer End Class Dim speciesSpec = bgFiles.GroupBy(Function(r) r.SPECIES_TYPE_ID) _ .Select(Function(g) New BGConstants.SPECIES() With { .SPECIESDESC = g.Key.ToString(), .SPECIESCOUNT = g.Count() }).ToList()
这样处理后,集合中的每个元素都是独立的SPECIES对象,不会出现被覆盖的问题,能得到你预期的结果。
内容的提问来源于stack exchange,提问作者Ann
相关产品推荐
相关产品推荐

