正在为猪的拉丁语类编写程序。它可以满足我上课的需要。它只要求输入要转换的阶段。但是我注意到,如果我在句子的末尾输入标点符号,则会弄乱最后一个单词的翻译。试图找出解决此问题的最佳方法。编程新手,但我需要它来检查单词中的最后一个字符以检查标点符号。在翻译之前将其删除,然后再添加回去。不知道该怎么做。正在阅读有关char.IsPunctuation的内容。另外,不确定该检查我的代码的哪一部分。
public static string MakePigLatin(string str)
{
string[] words = str.Split(' ');
str = String.Empty;
for (int i = 0; i < words.Length; i++)
{
if (words[i].Length <= 1) continue;
string pigTrans = new String(words[i].ToCharArray());
pigTrans = pigTrans.Substring(1, pigTrans.Length - 1) + pigTrans.Substring(0, 1) + "ay ";
str += pigTrans;
}
return str.Trim();
}
答案 0 :(得分:0)
以下内容将为您提供字母字符串,以便在它们后面的任何非字母字符传递时进行转换。
基于Splitting a string in C#的分隔符
public static string MakePigLatin(string str) {
MatchCollection matches = Regex.Matches(str, @"([a-zA-Z]*)([^a-zA-Z]*)");
StringBuilder result = new StringBuilder(str.Length * 2);
for (int i = 0; i < matches.Count; ++i) {
string pigTrans = matches[i].Groups[1].Captures[0].Value ?? string.Empty;
if (pigTrans.Length > 1) {
pigTrans = pigTrans.Substring(1) + pigTrans.Substring(0, 1) + "ay";
}
result.Append(pigTrans).Append(matches[i].Groups[2].Captures[0].Value);
}
return result.ToString();
}
matches变量应包含2组的所有match集合。第一组是要翻译的0个或多个字母,第二组是要传递的0个或多个非字母。与连接System.String值相比,StringBuilder应该具有更高的内存效率。我为它分配了一个初始字符串大小的两倍的起始分配,以避免避免分配的空间增加一倍。如果内存比较紧张,则最好使用1.25或1.5而不是2更好,但是之后可能必须将其转换回int。我从您的Substring调用中删除了长度计算,因为省略它已经将所有内容都捕获到了字符串的末尾。