我有一个接受对象列表的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()不是此
的解决方案答案 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()