来自词典

时间:2018-02-26 12:35:55

标签: vb.net linq dictionary

我有一本T字典,我希望根据谓词得到一系列集合的乘法

特别是我有一个字典(字符串)与平均(整数)和数据(整数) 我想将具有平均值>的所有元素的数据相乘。 6

Class Classroom
  Sub New(ByVal NewData As Integer, ByVal NewAverage As Integer)
    Average = NewAverage
    Data = NewData
  End Sub

  Dim Data As Integer
  Dim Average As Integer
End Class

Dim Elements As New Dictionary(Of String, Classroom)
Elements.Add("Simon", New Classroom( 6, 5))
Elements.Add("Jennifer", New Classroom(7, 7))
Elements.Add("Timoty", New Classroom(8, 4))
Elements.Add("Janet", New Classroom(7, 6))

我试过这个Linq表达式,但它不起作用

Dim Result as Integer = Elements.Where(Function(minAverage) minAverage.Value.Average > 6).Aggregate(Fuction(x, y) x.Value.Data * y.Value.Data)

1 个答案:

答案 0 :(得分:3)

Aggregate函数返回与列表中所有其他项相同类型的单个聚合对象。换句话说,如果您在人员列表中使用Aggregate,它将返回一个人。如果你在动物名单上使用它,它将返回一只动物。等等。由于您在Dictionary(Of String, Classroom)上使用它,这是KeyValuePair(Of String, Classroom)的列表,这意味着聚合将是该类型,而不是Integer,正如您的代码所期望的那样。

要使其正常工作,您需要执行以下两项操作之一。您需要在Aggregate函数中修复lambda,以便它返回KeyValuePair(Of String, Classroom)(并修复Result变量),或者您需要添加Select方法来转换在调用Aggregate之前列出更简单的。由于您没有使用聚合lambda中列表中的任何其他数据,因此后者似乎是更合适的方法。所以,例如:

Dim Result As Integer = Elements.
    Where(Function(pair) pair.Value.Average > 6).
    Select(Function(pair) pair.Value.Data).
    Aggregate(Function(x, y) x * y)