0

1000を超える一意のエントリを含むリストがあり、そのリストから50個のエントリのセットを1つの文字列にまとめて、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から抜けると、送信するために残されたもの。

4

4 に答える 4

2

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();
于 2012-05-26T03:27:29.380 に答える
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 が支援するものを使用したい場合は、MoreLinq ではなくReactive Extensionsを使用するのはどうですか?

あなただけが必要です(BufferDo組み合わせてToObservable()から元に戻すToEnumerable()):

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

別のチェックブロックを追加するだけです..

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