每个 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 我就会剩下剩下的要发送。
你可以
使用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怎么样?
您只需要Buffer
和Do
(与ToObservable()
结合使用,然后返回ToEnumerable()
):
queryList.ToObservable()
.Buffer(40).Do(x => Console.WriteLine(String.Join(Environment.NewLine, x.ToArray())))
.ToEnumerable().ToArray();