将文本框句子自动输入数组

时间:2017-08-26 02:49:48

标签: c# arrays for-loop

请查看Microsoft的代码以获取翻译数组:

var from = "en";
        var to = "es";
        var translateArraySourceTexts = textbox.Text.Split(new Char[] { '.' });
        var uri = "https://api.microsofttranslator.com/v2/Http.svc/TranslateArray";
        var body = "<TranslateArrayRequest>" +
                       "<AppId />" +
                       "<From>{0}</From>" +
                       "<Options>" +
                       " <Category xmlns=\"http://schemas.datacontract.org/2004/07/Microsoft.MT.Web.Service.V2\" />" +
                           "<ContentType xmlns=\"http://schemas.datacontract.org/2004/07/Microsoft.MT.Web.Service.V2\">{1}</ContentType>" +
                           "<ReservedFlags xmlns=\"http://schemas.datacontract.org/2004/07/Microsoft.MT.Web.Service.V2\" />" +
                           "<State xmlns=\"http://schemas.datacontract.org/2004/07/Microsoft.MT.Web.Service.V2\" />" +
                           "<Uri xmlns=\"http://schemas.datacontract.org/2004/07/Microsoft.MT.Web.Service.V2\" />" +
                           "<User xmlns=\"http://schemas.datacontract.org/2004/07/Microsoft.MT.Web.Service.V2\" />" +
                       "</Options>" +
                       "<Texts>" +
                         **  "<string xmlns=\"http://schemas.microsoft.com/2003/10/Serialization/Arrays\">{2}</string>" +
                          ** "<string xmlns=\"http://schemas.microsoft.com/2003/10/Serialization/Arrays\">{3}</string>" +
                         ** "<string xmlns=\"http://schemas.microsoft.com/2003/10/Serialization/Arrays\">{4}</string>" +
                       "</Texts>" +
                       "<To>{5}</To>" +
                   "</TranslateArrayRequest>";
       ** string requestBody = string.Format(body, from, "text/plain", translateArraySourceTexts[0], translateArraySourceTexts[1], translateArraySourceTexts[2], to);

        using (var client = new HttpClient())
        using (var request = new HttpRequestMessage())
        {
            request.Method = HttpMethod.Post;
            request.RequestUri = new Uri(uri);
            request.Content = new StringContent(requestBody, Encoding.UTF8, "text/xml");
            request.Headers.Add("Authorization", authToken);
            var response = await client.SendAsync(request);
            var responseBody = await response.Content.ReadAsStringAsync();
            switch (response.StatusCode)
            {
                case HttpStatusCode.OK:
                    Console.WriteLine("Request status is OK. Result of translate array method is:");
                    var doc = XDocument.Parse(responseBody);
                    var ns = XNamespace.Get("http://schemas.datacontract.org/2004/07/Microsoft.MT.Web.Service.V2");
                    var sourceTextCounter = 0;
                    foreach (XElement xe in doc.Descendants(ns + "TranslateArrayResponse"))
                    {
                        foreach (var node in xe.Elements(ns + "TranslatedText"))
                        {
                            Console.WriteLine("\n\nSource text: {0}\nTranslated Text: {1}", translateArraySourceTexts[sourceTextCounter], node.Value);
                        }
                        sourceTextCounter++;
                    }
                    break;
                default:
                    Console.WriteLine("Request status code is: {0}.", response.StatusCode);
                    Console.WriteLine("Request error message: {0}.", responseBody);
                    break;
            }
        }
    }

请关注**线。我想翻译输入框中的句子,并使用“。”作为每个句子的指标。

我的问题是,在带有**的行代码中,目前只能检测到3个句子。如果我输入超过3个句子,则不会检测到第四个句子和其余句子。如果输入少于3个句子,则会出现错误System.IndexOutOfRangeException: 'Index was outside the bounds of the array.

我的问题是,如果系统检测到更多句子并自动调整数组,如何让系统自动附加数组?请给我一些建议

2 个答案:

答案 0 :(得分:0)

在你的html字符串中,变量的空格定义为{0},{1},{2},{3},{4},{5}。

您突出显示的行是

string.Format(body, from, "text/plain", translateArraySourceTexts[0], translateArraySourceTexts[1], translateArraySourceTexts[2], to);

正在用&#34; from&#34; 取代{0} <{>} text/plain ,{1},{ 2} translateArraySourceTexts[0] ,{3} translateArraySourceTexts[1] ,{4} translateArraySourceTexts[2] , {5}按此顺序 to

由于您只使用文本句子的索引[0], [1] and [2],因此您只能在文档正文中附加3个句子。

如何解决?

您可以在文本框中输入更多句子。拆分时,translateArraySourceTexts将包含更多项目。在正文HTML字符串中添加更多索引以获得更多句子(如{6},{7}),然后将您的句子传递给string.Format中的body作为translateArraySourceTexts [3],translateArraySourceTexts [4]。它会工作。它将改变为下面提到的内容。

string.Format(body, from, "text/plain", translateArraySourceTexts[0], translateArraySourceTexts[1], translateArraySourceTexts[2], translateArraySourceTexts[3], translateArraySourceTexts[4], to);

有关string.Format

的更多信息

http://blog.stevex.net/string-formatting-in-csharp/

https://channel9.msdn.com/Forums/TechOff/Help-with-C-Method-with-a-string-and-Multiple-Parameters

修改 既然你提到你可以输入很多句子。你已经拆分了这些句子并获得了一个数组长度,例如x。我们只需将这一系列句子称为句子。创建一个大小为x + 3的对象数组。因此,如果输入4个句子,则创建一个7的对象数组。

object[] dataArr = new object[x+3]

您已经在 <string tags> xml节点中创建了 <Texts>字符串您需要输入与句子一样多的字符串。在这种情况下,您需要在<string tags>部分中添加4个<Texts>字符串,每个字符串都会增加占位符,例如{2},{3},{4}等等。 现在,填充此dataArr。

dataArr[0] = from;
dataArr[1] = "text/plain";  
dataArr[dataArr.Length - 1] = to;

for(var i=2; i < dataArr.Length - 1; i++)
{
 dataArr[i] = sentences[i-2];  
}

并将 dataArr 传递给 string.Format

string.Format(body,dataArr) 

答案 1 :(得分:0)

如果您正在使用C#6,字符串插值和LINQ将起作用。 String.Format()限制您可以在此处执行的操作。

字符串插值(一行字符串前面带有 $ $ @ 多行)让您只需将变量表达式用 {} 包围,就可以直接将数据插入到字符串中...... 可以让您更轻松地执行此类操作...

       var contentType = "text/plain";
       var body = $@"<TranslateArrayRequest>
                   <AppId />
                   <From>{from}</From>
                   <Options>
                   <Category xmlns=\"http://schemas.datacontract.org/2004/07/Microsoft.MT.Web.Service.V2\" />
                       <ContentType xmlns=\"http://schemas.datacontract.org/2004/07/Microsoft.MT.Web.Service.V2\">{contentType}</ContentType>
                       <ReservedFlags xmlns=\"http://schemas.datacontract.org/2004/07/Microsoft.MT.Web.Service.V2\" />
                       <State xmlns=\"http://schemas.datacontract.org/2004/07/Microsoft.MT.Web.Service.V2\" />
                       <Uri xmlns=\"http://schemas.datacontract.org/2004/07/Microsoft.MT.Web.Service.V2\" />
                       <User xmlns=\"http://schemas.datacontract.org/2004/07/Microsoft.MT.Web.Service.V2\" />
                   </Options>
                   <Texts>{String.Join("\r",translatedArraySourceTexts.Select(s=>$"<string xmlns=\"http://schemas.microsoft.com/2003/10/Serialization/Arrays\">{s}</string>"))}</Texts>
                   <To>{to}</To>
               </TranslateArrayRequest>";

以下是它的工作原理:

  1. 使用$ @将您的身体放入多行字符串中以使其更容易理解(并且编译器工作少一点:))
  2. 将变量直接插入字符串中,并被{}
  3. 包围
  4. 当您转到代码时,请使用此{String.Join("\r",translatedArraySourceTexts.Select(s=>$"<string xmlns=\"http://schemas.microsoft.com/2003/10/Serialization/Arrays\">{s}</string>"))}
  5. 替换内容

    从内部开始:它使用LINQ to Select()每个句子并使用嵌套字符串插值($"<string... {s}</string>")插入标记,然后< strong> String.Join()将结果组合成一个由回车分隔的字符串。

    同样,这仅适用于C#6.0

    您可以在字符串插值here上找到更多信息。