每个 X 结果形成一串数据

本文关键字:一串 数据 结果 每个 | 更新日期: 2023-09-27 18:35:33

>我有一个包含 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 个初始值),之后它工作得很好,但我想知道是否有更好的方法可以让这组字符串在 webrequest 上使用?

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

每个 X 结果形成一串数据

你可以

使用MoreLinq

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

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

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

对于 Web 客户端请求

,请将 Console.WriteLine 替换为 Web 客户端请求调用。

queryList.Batch(40).Pipe(x=>Console.WriteLine(String.Join(Environment.NewLine, x.ToArray()))).ToArray();

只需添加另一个检查块。

    if (i % 40 == 1)
    {
        if (i == 1)
            continue;
        // Send webclient request
        query = string.Empty;
    }

您可以使用内置的 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.
}

如果你更喜欢使用Microsoft支持的东西,那么使用反应式扩展而不是MoreLinq怎么样?

您只需要BufferDo(与ToObservable()结合使用,然后返回ToEnumerable()):

queryList.ToObservable()
         .Buffer(40).Do(x => Console.WriteLine(String.Join(Environment.NewLine, x.ToArray())))
         .ToEnumerable().ToArray();