从VB.Net中的List获取不同值的总和

时间:2017-07-22 11:05:26

标签: vb.net

我有一个名为Cart_Items的列表,当用户按下添加到购物车按钮时,它会被填充。该列表包含对象ItemID和Quantity。 我需要从这个列表中获取一个项目的总数量。由于列表中有不同的项目,我无法获得特定项目的总数量。 如果我使用sum(函数)它返回所有数量的总和。 我想要实现的是,如果同一项目有多个记录,那么获得该特定项目的数量的总和。 这是类结构:

Public Class CartItem
Private m_ItemId As Integer
Public Property ItemId() As Integer
    Get
        Return m_ItemId
    End Get
    Set(value As Integer)
        m_ItemId = value
    End Set
End Property

Private m_Quantity As Integer
Public Property Quantity() As Integer
    Get
        Return m_Quantity
    End Get
    Set(value As Integer)
        m_Quantity = Value
    End Set
End Property
End Class

列表:

ItemId      Quantity
1            5
3            6
1            2
1            6
4            8

所以我想得到ItemId = 1的总数量应为13。

那么获得特定itemId的总数量的最佳方法是什么? 感谢。

2 个答案:

答案 0 :(得分:2)

您需要按照Id对所有项目进行分组,每个组的计算总和为Quantity

var itemTotals = myList.GroupBy(Function(item) item.ItemId)
                       .Select(Function(group)
                                  Return New With
                                  {
                                      .ItemId = group.Key,
                                      .Quantity = group.Sum(Function(item) item.Quantity)
                                  }
                               End Function)
                       .ToList()

因此,您将获得包含myList中所有项目及其总数量的匿名对象的集合。

{ .ItemId = 1, Quantity = 13 }
{ .ItemId = 3, Quantity = 6 }
{ .ItemId = 4, Quantity = 8 }

您可以使用CartItem类代替匿名类型,因为它在相同的上下文中具有相同的属性。所以Select pert将如下所示:

.Select(Function(group)
            Return New CartItem With
            {
                .ItemId = group.Key,
                .Quantity = group.Sum(Function(item) item.Quantity)
            }
        End Function)

答案 1 :(得分:1)

首先,使用给定条件过滤项目,在这种情况下,CartItems itemId 1 distinct。然后选择所有数量,并应用sum删除重复的值,最后Dim result As Integer = (From item In myList Where item.ItemId = 1 Select item.Quantity).Distinct().Sum() 结果。

{{1}}