我是以这种方式执行的,但是它删除了字符串中的先前字符,输出的是(Magic,Agic,Gic,Ic,C),但是我希望整个字符串在连接之前和之后进行连接。
public string[] Transform(string st)
{
string[] arr = new string[st.Length];
string[] arr1 = new string[st.Length];
for (int x = 0; x < st.Length; x++)
{
arr1[x] = char.ToLower(st[x]) + "".ToString();
}
for (int i = 0; i < st.Length; i++)
{
string st1 = "";
{
st1 = char.ToUpper(st[i]) + st.Substring(i + 1);
}
arr[i] = st1;
}
return arr;
}
答案 0 :(得分:2)
您可以单循环执行此操作:
public static string[] Transform(string str)
{
var strs = new List<string>();
var sb = new StringBuilder();
for (int i = 0; i < str.Length; i++)
{
sb.Clear();
sb.Append(str);
sb[i] = char.ToUpper(str[i]);
strs.Add(sb.ToString());
}
return strs.ToArray();
}
这是将str
添加到StringBuilder
,然后用该字符的大写形式修改索引字符。例如,输入abcde
将给出:
Abcde aBcde abCde abcDe abcdE
如果您真的想花哨的话,我敢肯定有一些复杂的LINQ可以做到这一点,但这为您提供了如何工作的基本框架。
答案 1 :(得分:0)
您忘记添加字符串的左侧部分。尝试这样做:
st1 = st.ToLower()。Substring + char.ToUpper(st [i])+ st.Substring(i +1);
答案 2 :(得分:0)
与@Ron Beyer的答案相比,我决定放一个末端的分析器来检查CPU使用率和内存。
这是我的第一次尝试:
public static void Main()
{
var result = Transform("abcde");
result.ToList().ForEach(WriteLine);
}
public static IEnumerable<string> Transform(string str)
{
foreach (var w in str)
{
var split = str.Split(w);
yield return split[0] + char.ToUpper(w) + split[1];
}
}
结果:
Abcde
aBcde
abCde
abcDe
abcdE
代码提琴https://dotnetfiddle.net/gnsAGX
上面的代码有一个巨大的缺点,它仅在所传递的单词具有唯一字母时才有效。因此,“ aaaaa”将不会产生正确的结果。
这是我第二次成功尝试,似乎可以与任何字符串输入一起使用。我使用StringBuilder的一个实例来减少需要在一个实例上创建和管理的对象的数量,而不是复制太多的对象,以便对其进行优化。
public static void Main()
{
var result = Transform("aaaaa");
result.ToList().ForEach(WriteLine);
}
public static IEnumerable<string> Transform(string str)
{
var result = new StringBuilder(str.ToLower());
for( int i = 0; i < str.Length; i++)
{
result[i] = char.ToUpper(str[i]);
yield return result.ToString();
result[i] = char.ToLower(str[i]);
}
}
结果:
Aaaaa
aAaaa
aaAaa
aaaAa
aaaaA
测量执行时间和内存使用量。
我将使用dotnetfiddle.net状态面板来简化操作。
小提琴有一些限制,例如10秒的代码执行时间和已用的内存
此外,差异非常显着。
我测试了14 000次重复的程序,我的代码另外将输出更改为array []。
我的答案(https://dotnetfiddle.net/1fLVw9)
Last Run: 12:23:09 pm
Compile: 0.046s
Execute: 7.563s
Memory: 16.22Gb
CPU: 7.609s
比较的答案(https://dotnetfiddle.net/Zc88F2)
Compile: 0.031s
Execute: 9.953s
Memory: 16.22Gb
CPU: 9.938s
它稍微减少了执行时间。 希望这会有所帮助!
答案 3 :(得分:0)
这里。这是使用字符串生成器和List的方法的两倍。
public static string[] Transform(string str)
{
var strs = new string [str.Length];
var sb = str.ToCharArray();
char oldCh;
for (int i = 0; i < str.Length; i++)
{
oldCh = sb[i];
sb[i] = char.ToUpper(sb[i]);
strs[i] = new string (sb);
sb[i] = oldCh;
}
return strs;
}
无需清除并继续将字符串读取到字符串生成器。我们还知道数组的大小,以便可以在开始时分配它。
答案 4 :(得分:0)
public static string[] Transform(string str)
{
var strs = new string [str.Length];
var sb = str.ToCharArray();
char oldCh;
for (int i = 0; i < str.Length; i++)
{
oldCh = sb[i];
sb[i] = char.ToUpper(sb[i]);
strs[i] = new string (sb);
sb[i] = oldCh;
}
return strs;
}