我有一个任务,我必须编写一个名为accum
的函数,它将给定的字符串转换成这样的字符:
Accumul.Accum("abcd"); // "A-Bb-Ccc-Dddd"
Accumul.Accum("RqaEzty"); // "R-Qq-Aaa-Eeee-Zzzzz-Tttttt-Yyyyyyy"
Accumul.Accum("cwAt"); // "C-Ww-Aaa-Tttt"
到目前为止,我只将每个字母转换为大写字母......现在我正在写它,我想我可以更容易 - 首先将每个字母的数量相乘,然后在那里添加一个短划线......好吧,好吧,让我说我已经乘以它们的数量(我稍后会处理它),现在我需要添加破折号。我尝试了几种方法来解决这个问题,包括:for和foreach(现在我想起来了,我不能使用foreach,如果我想在将字母相乘后添加一个破折号)和String.Join,String.Insert之类的东西名为StringBuilder with Append(我并不完全理解),它对字符串没有任何作用。
我试过的其中一个循环是:
for (int letter = 0; letter < s.Length-1; letter += 2) {
if (letter % 2 == 0) s.Replace("", "-");
}
和
for (int letter = 0; letter < s.Length; letter++) {
return String.Join(s, "-");
}
第二个返回“无法访问的代码”错误。我在这里做错了什么,它对字符串没有任何作用(在大写转换后)?另外,有没有方法可以复制每个字母,以增加它们的数量?
答案 0 :(得分:2)
正如您所说,只要创建了可枚举而不是foreach,就可以使用string.join
。由于字符串本身是可枚举的,因此可以使用包含索引的Linq select重载:
var input = "abcd";
var res = string.Join("-", input.Select((c,i) => Char.ToUpper(c) + new string(Char.ToLower(c),i)));
(假设每个字符都是唯一的或可以使用。例如“aab”将变为“A-Aa-Bbb”)
说明:
Select
扩展方法将lambda函数作为参数,c
是char,i
是索引。 lambda返回char(c
)的大写版本,后面跟着索引长度(new string(char,length)
)的小写字符串的字符串(这是第一个索引的空字符串)。最后,string.join
将结果枚举与每个元素之间的-
连接起来。
答案 1 :(得分:0)
使用此代码。
string result = String.Empty;
for (int i = 0; i < s.Length; i++)
{
char c = s[i];
result += char.ToUpper(c);
result += new String(char.ToLower(c), i);
if (i < s.Length - 1)
{
result += "-";
}
}
最好使用StringBuilder
而不是字符串连接,但这段代码可以更清晰一些。
答案 2 :(得分:0)
字符串是不可变的,这意味着一旦创建它们就无法修改它们。这意味着Replace
函数返回一个你需要以某种方式捕获的新字符串:
s = s.Replace("x", "-");
您目前没有在任何地方分配Replace方法的结果,这就是您没有看到任何结果的原因
答案 3 :(得分:0)
对于未来,解决这类问题的最佳方法不是搜索代码片段,而是逐步写下如何用普通英语或其他伪代码实现预期结果的算法,例如:
鉴于我输入字符串&#39; abcd&#39;应该变成输出字符串&#39; A-Bb-Ccc-Dddd&#39;。
Aha时刻经常发生在第三次迭代中。希望能帮助到你! :)