私はMicrosoft Translator API、具体的にはTranslateArrayメソッドを使用しています。私の挑戦は、texts
パラメータの組み込み制限です。リストをチャンクする方法<T>?
[...]変換するテキストを含む配列です。 [...]翻訳されるすべてのテキストの合計は10000文字を超えてはいけません。配列要素の最大数は2000です。
さまざまな長さ(Title、Desc)の可変長のList要素を取得しています。このデータをTranslateArray()
に渡したいが、適切なサイズにする必要がある。これどうやってするの?
public class TranslateItem
{
public string Title { get; set; }
public string Desc { get; set; }
}
private static void chunkNorris()
{
// list contains elements to be translated
var list = new List<TranslateItem>();
var chunkList = new List<TranslateItem>();
int itemLength = 0; int totalLength = 0;
foreach (var batch in list.Batch(1000))
{
foreach (var item in batch)
{
itemLength = item.Title.Length + item.Desc.Length;
totalLength = totalLength + itemLength;
if (itemLength <= 10000 && totalLength <= 10000)
{
chunkList.Add(new TranslateItem() { Title = item.Title, Desc = item.Desc });
}
else
{
// do translation here...
// bug here: itemLength can be > 10000
// reset chunkList and add item to empty list
chunkList.Clear();
itemLength = totalLength = item.Title.Length + item.Desc.Length;
chunkList.Add(new TranslateItem() { Title = item.Title, Desc = item.Desc});
}
if (item.Equals(list.Last()))
{
// do translation here...
}
}
}
}
更新:これは私が持っているものです。コードは、2000個の配列要素の制限に準拠するように、1000個の「バッチ」(つまり、1000個の2列)で配列を実行し分割します。ただし、10,000文字を超えるサイズの問題は修正されません。さらに、コードはかなり不器用です - LINQをより洗練された方法で使用できるかどうか疑問に思っていました。 Batch method from here。
簡単な問題を解決します。あなたのリストに1つの要素があったらどうなりますか? –
何を試しましたか?あなたの質問は、述べたように広すぎます。あなたは基本的にスタックオーバーフローがあなたのためにあなたの仕事をするように要求しています。正解には、さまざまな形があります。何か努力をしてから、あなたの質問に良い[mcve]を含めて、そしてあなたが何が問題になっているのかを具体的に説明することを含め、その努力が何だったのかを説明してください。また、問題が不完全に指定されていることにも注意してください。特に、リストのいずれかの要素が10K文字制限を超えている可能性はありますか?もしそうなら、あなたはそれにどのように対処したいのですか?もしそうでなければ、どうしてそんなことが分かりますか? –
例が更新されました。 10,000文字以上の単一要素の問題はまだ修正されません。コードはかなり不器用で、長い昼/夜です。 – Sha