Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
F# Seq模块中的聚合函数_F#_Dictionary_Seq - Fatal编程技术网

F# Seq模块中的聚合函数

F# Seq模块中的聚合函数,f#,dictionary,seq,F#,Dictionary,Seq,我试图向Seq模块添加一些额外的聚合函数。我正在研究下面列出的一些功能的实现: 免责声明之一是“此函数返回一个序列,该序列在迭代该序列后立即消化整个初始序列。因此,此函数不应用于大序列或无限序列。” 许多函数都是如此,比如GroupBy 第一个问题:有没有编写聚合函数的方法可以有效地处理大型序列?我知道“大”是主观的;我只是在寻找编写此类函数的通用模式 第二个问题:如何确保像Dictionary(在聚合函数中定义)这样的集合被有效地垃圾收集?我理解字典在超出范围时应该被收集,但是有没有一种方

我试图向Seq模块添加一些额外的聚合函数。我正在研究下面列出的一些功能的实现:

免责声明之一是“此函数返回一个序列,该序列在迭代该序列后立即消化整个初始序列。因此,此函数不应用于大序列或无限序列。” 许多函数都是如此,比如GroupBy

  • 第一个问题:有没有编写聚合函数的方法可以有效地处理大型序列?我知道“大”是主观的;我只是在寻找编写此类函数的通用模式

  • 第二个问题:如何确保像Dictionary(在聚合函数中定义)这样的集合被有效地垃圾收集?我理解字典在超出范围时应该被收集,但是有没有一种方法可以明确指出这一点?鉴于字典的作用域是保持在函数中,我也不能调用.Clear(),对吗


回答您的第一个问题-在这种情况下,大输入的问题是必须先处理整个序列,然后才能使用
fold
groupBy
等函数给出结果。您可以做以下几件事:

  • 使用像
    Seq.scan
    这样的函数来聚合值,就像
    fold
    一样,但在添加每个元素后生成当前状态-结果也是顺序的,您可以懒散地使用它(例如,获得越来越精确的结果)


  • 当编写返回
    Seq的函数时,您需要哪种类型的聚合不能在
    Seq.fold
    中实现?类似SumBy函数的东西怎么样?类似于Seq,您可能希望按第一列分组,按第二列求和。。您可以执行Seq.GroupBy并将其管道化为Seq.Sum,但执行效果很差。@ildjarn:是的,这适用于单个列上的SumBy。事实上,SumBy是内置的,所以它可以工作。我在寻找CountBy函数的等价物。CountBy按键分组,并返回每个键出现的次数。我想按键分组,并返回另一列的总和。一个更具体的例子:假设一个电话呼叫日志,其中PhoneNo、CallDuration作为列。我想获取总通话时间最长的PhoneNos。