简化了在vb.net中查找对象列表中的重复项并合并它们的方法

时间:2017-05-19 08:33:23

标签: vb.net

我有一个接受对象列表的API(对象包含ProductID和Quantity)。我想确定传递的列表中是否有重复的产品ID。如果找到重复项,我将通过添加重复产品ID的数量来合并它们。为此,我创建了自己的算法,逐个循环列表,然后将其存储到另一个列表(已验证的列表)。代码是这样的。

For Each passedVoucher As VoucherInfo In VouchersToRelease

     indexofduplicate = 0
     sumQuantity = 0
     hasDuplicate = False

     If VerifiedReleasedVouchers.Count() > 0 Then

         'for loop that checks if productID exists in the VerifiedReleasedVouchers
          For Each finalList As VoucherInfo In VerifiedReleasedVouchers

            If passedVoucher.ProductID = finalList.ProductID Then
                 indexofduplicate = VerifiedReleasedVouchers.IndexOf(finalList)

                 'if true, adds the Quantity of duplicate to the existing quantity at the VerifiedReleasedVouchers 
                 sumQuantity = Convert.ToInt32(VerifiedReleasedVouchers(indexofduplicate).Quantity) + Convert.ToInt32(passedVoucher.Quantity)

                 VerifiedReleasedVouchers(indexofduplicate).Quantity = sumQuantity.ToString

                 hasDuplicate = True
                 Exit For
            End If
         Next
      End If

      'adds the voucher to verified released voucher if no duplicate was found
      If hasDuplicate = False Then
         VerifiedReleasedVouchers.Add(passedVoucher)
      End If

 Next

所以我做的是,我ForEach循环传递的列表。在循环内部,我将来自传递列表的当前对象与已验证列表中的每个对象进行比较(默认情况下,w / c为空)以确定它们是否是重复的产品ID。如果没有找到重复,我只需将当前对象添加到verifiedList。如果找到重复,则只需通过存储两个对象的数量总和,从具有相同ProductID的已验证列表中更新对象。

上面的代码完全符合预期,但问题是,它执行了很多任务。有没有办法简化我上面做的事情?

P.S。 List.Distinct()不是此

的解决方案

1 个答案:

答案 0 :(得分:1)

您可以使用Linq轻松实现您想要的效果。首先,您必须GroupBy ProductID,然后Select所有具有数量总和的组。最后,我们得到一个清单:

Dim VerifiedReleasedVouchers As List(Of VoucherInfo) = VouchersToRelease.GroupBy(Function(x) x.ProductID).[Select](Function(y) New VoucherInfo() With {
.ProductID = y.Key,
.Quantity = y.Sum(Function(z) z.Quantity),
.Denom = y.First().Denom
}).ToList()