0

我有一个包含 1000 多个唯一条目的列表,我想从中形成,将 50 个条目组合成一个字符串,用于 Web 客户端请求。

这是我想出的:

string query = string.Empty;
for (int i = 0; i < queryList.Count; i++)
{
    query += queryList[i] + Environment.NewLine;
    if (i % 40 == 1)
    {
        // Send webclient request
        query = string.Empty;
    }
}

由于 1 也是倍数,它会在结果 1 处触发(不确定如何规避并发送 2 个初始值),之后它工作得很好,但我想知道是否有更好的方法来制作这组字符串使用网络请求?

此外,当它退出 for 时,我必须手动发送最后一个字符串,因为如果计数总数不是它的倍数,它不会在最后触发,所以一旦它退出 for 我将拥有剩下什么要发送。

4

4 回答 4

2

您可以使用MoreLinq

MoreLinq.Batch -> 将集合分成批次。

MoreLinq.Pipe -> 类似于 Select,允许进行方法调用

以下查询将queryList分成40个批次,然后一次打印40个项目(类似于问题的逻辑)。

对于 webclient 请求,将 Console.WriteLine 替换为 webclient 请求调用。

queryList.Batch(40).Pipe(x=>Console.WriteLine(String.Join(Environment.NewLine, x.ToArray()))).ToArray();
于 2012-05-26T03:27:29.380 回答
1

只需添加另一个检查块..

    if (i % 40 == 1)
    {
        if (i == 1)
            continue;
        // Send webclient request
        query = string.Empty;
    }
于 2012-05-26T03:25:36.803 回答
1

您可以使用内置的GroupBy来构建有效负载。

var data = Enumerable.Range(0, 1000)
    .Select(value => value.ToString());

var payloads = data
    .Select((value, idx) => new {idx, value})

    // Abuse automatic integer division cut off.
    .GroupBy(x => x.idx/40)

    // Transform every group into a concatenated string built
    // from all entries in that group.
    .Select(g => g.Aggregate(String.Empty, (curr, next) => curr + next.value + Environment.NewLine));

foreach (var payload in payloads) {
    // Send payload to webservice.
}
于 2012-05-26T03:32:49.553 回答
1

如果您更喜欢使用 Microsoft 支持的东西,那么使用Reactive Extensions而不是 MoreLinq 怎么样?

你只需要Bufferand Do(结合ToObservable()然后返回ToEnumerable()):

queryList.ToObservable()
         .Buffer(40).Do(x => Console.WriteLine(String.Join(Environment.NewLine, x.ToArray())))
         .ToEnumerable().ToArray();
于 2012-05-26T08:18:43.823 回答