将字符串作为输入并按如下所示返回字符串数组的函数ABC(abcde)应该返回[Abcde,aBcde,abcde,abcDe,abcdE]

时间:2018-07-29 18:35:58

标签: c# asp.net .net arrays function

我是以这种方式执行的,但是它删除了字符串中的先前字符,输出的是(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; 

 }

5 个答案:

答案 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

Try it out on DotNetFiddle

如果您真的想花哨的话,我敢肯定有一些复杂的LINQ可以做到这一点,但这为您提供了如何工作的基本框架。

答案 1 :(得分:0)

您忘记添加字符串的左侧部分。尝试这样做:

st1 = st.ToLower()。Substring + char.ToUpper(st [i])+ st.Substring(i +1);

答案 2 :(得分:0)

  1. 我为您的问题(这是第二个代码段)写了一个答案,您可以根据需要对其进行修改,例如将返回类型更改为string [],或者如果愿意,可以使用ToArray()扩展方法。我认为这种方式更具可读性。

与@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”将不会产生正确的结果。

  1. 这是我第二次成功尝试,似乎可以与任何字符串输入一起使用。我使用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
    

    代码小提琴:https://dotnetfiddle.net/tzhXtP

  2. 测量执行时间和内存使用量。

    我将使用dotnetfiddle.net状态面板来简化操作。 小提琴有一些限制,例如10秒的代码执行时间和已用的内存
    此外,差异非常显着。 我测试了14 000次重复的程序,我的代码另外将输出更改为array []。

它稍微减少了执行时间。   希望这会有所帮助!

答案 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;
}