【问题标题】:Linq aggregate from Dictionary来自字典的 Linq 聚合
【发布时间】:2018-02-26 12:35:55
【问题描述】:

我有一本 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)

【问题讨论】:

  • 怎么不工作了?你有例外吗?错误的答案?
  • 无法将整数值转换为 System.Collections.Generic.KeyValuePair(Of String, Classroom)

标签: vb.net linq dictionary


【解决方案1】:

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)

【讨论】:

  • 谢谢史蒂文,很好的解释,简单易懂
猜你喜欢
  • 1970-01-01
  • 2015-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-24
  • 1970-01-01
相关资源
最近更新 更多