【问题标题】:appending results to array after parallel processing并行处理后将结果附加到数组
【发布时间】:2018-04-03 23:49:37
【问题描述】:

一些口才问题:

A.如何以雄辩的方式将由并行处理形成的列表直接添加到并发结果数组中。

let results = System.Collections.Concurrent.ConcurrentBag<string>()
let tasks = System.Collections.Generic.List<string>()
tasks.add("a")
tasks.add("b")

let answers = tasks
        |> Seq.map asyncRequest
        |> Async.Parallel
        |> Async.RunSynchronously
        |> Array.toList

Array.append results answers

尝试有没有办法通过管道操作符追加?

let answers = tasks
        |> Seq.map asyncRequest
        |> Async.Parallel
        |> Async.RunSynchronously
        |> Array.append results

B.有没有办法通过 List 构造函数添加项目?

let tasks = System.Collections.Generic.List<string>()
tasks.add("a")
tasks.add("b")

C.有没有办法使用队列构造函数从数组构造队列?

let items: string[] = [|"a", "b", "c"|]
let jobs = System.Collections.Generic.Queue<string>()

items |> Array.map jobs.Enqueue |> ignore

【问题讨论】:

  • 我想你最好在这里问所有这些问题:chat.stackoverflow.com/rooms/51909/f
  • 我没有看到在那里发布消息的选项。我可以看到聊天室。我认为我没有在聊天室中获得授权
  • @Developer11 - You need to have at least 20 reputation points to talk in chat rooms,所以你应该可以。当我点击聊天室时,屏幕底部有一个大栏,上面有一个文本框和两个按钮:“发送”和“上传...”。 “发送”按钮将发布一条聊天消息。当你点击聊天室时,你看到那个栏和那些按钮了吗?如果你不这样做,就会发生一些不寻常的事情。 更新:没关系,只是注意到你在那个聊天室里发了好几次,所以显然你想通了。
  • 是的,最初是,问题是点击通知将我带到不提供发送消息的聊天记录,只通过所有房间,然后 F# 工作。

标签: parallel-processing f#


【解决方案1】:

答.您不能在results 上使用Array.append,因为resultsConcurrentBag,但Array.append 期望它的参数是Array。要将内容添加到ConcurrentBag,请使用其Add method。一项一项添加:

tasks
    |> Seq.map asyncRequest
    |> Async.Parallel
    |> Async.RunSynchronously
    |> Array.iter results.Add

逐个添加项目效率有点低。如果您的ConcurrentBag 确实是在同一个函数中创建的,如您的示例所示,您可以考虑使用它的constructor that takes an IEnumerable&lt;T&gt;

let answers = tasks
    |> Seq.map asyncRequest
    |> Async.Parallel
    |> Async.RunSynchronously

let results = System.Collections.Concurrent.ConcurrentBag<string>( answers )

B. 是的,有一种方法可以将内容添加到 System.Collections.Generic.List&lt;T&gt;。这个类为此提供了a handy Add method

tasks.Add "a"
tasks.Add "b"

将参数括在括号中(如您的尝试)不是必需的,但允许:

tasks.Add("a")
tasks.Add("b")

C. 是的,有一种方法可以从数组构造队列。 Queue 类有a constructor that takes an IEnumerable&lt;T&gt;,而数组实现了IEnumerable&lt;T&gt;,因此您可以在数组上调用该构造函数:

let jobs = System.Collections.Generic.Queue<string>( items )

请注意,您几乎不需要我的帮助即可获得上述任何信息。一切都可以在 MSDN(参见上面的链接)或您喜欢的代码编辑器中的自动完成/智能感知中免费获得。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多