Как мне прописать каждый третий символ в моем коде C#? - PullRequest
0 голосов
/ 29 марта 2020

Я узнаю о C#, но кое-что меня расстраивает. Я изучал строковые методы и как они работают.

public static void CaseFlip()
        {
            Console.WriteLine("             CaseFlip -- Output");
            Console.WriteLine("==============================================================================");


           for (int i = 0; i < text.Length; i ++)
           {
            char[]delimiters = {'/'};
            string[]splitString = text.Split(delimiters);


                for (int k  = 0; k < splitString.Length; k +=3)
                    {
                    string sub = text.Substring(0);
                    string remove = sub.Remove(4, text.Length);
                    string insert = remove.Insert(0, sub);

                    splitString[k] = splitString[k].ToUpper();
                    Console.WriteLine(splitString[k]);
                    }
           }
           Console.WriteLine(" ");

        }

и мой строковый массив:

static string text = "You only have one chance to make a first impression/" +
        "Consider the source and judge accordingly/" +
        "You can do something for a day you can't imagine doing for a lifetime/" +
        "Are we not drawn onward, we few, drawn onward to new era/" +
        "Never odd or even/" +
        "Madam, I'm Adam/" +
        "What do you mean? It's not due tomorrow, is it?";

Что делать?

Ответы [ 4 ]

1 голос
/ 29 марта 2020

Первый for л oop не нужен; один l oop должен повторять столько разделителей, сколько в тексте. Также вы получите исключение в этой строке

string remove = sub.Remove(4, text.Length);

, так как вы пытаетесь создать новую строку, удалив часть всего текста, начиная с 4-го символа и набирая столько символов, сколько и текст .Длина - эффективно выходит за пределы. Попробуйте это:

public static void CaseFlip(string text)
{
    Console.WriteLine("             CaseFlip -- Output");
    Console.WriteLine("==============================================================================");

    char[] delimiters = { '/' };
    string[] splitString = text.Split(delimiters);
    StringBuilder sb = new StringBuilder();

    for (int i = 0; i < splitString.Length; i++)
    {
        char[] charsInLine = splitString[i].ToCharArray();

        for (int k = 0; k < charsInLine.Length; k++)
        {
            sb.Append(k % 3 == 0 ? char.ToUpper(charsInLine[k]) : charsInLine[k]);
        }
        sb.Append(' ');
    }

    Console.WriteLine(sb.ToString());
    Console.WriteLine(" ");
}

Вы должны рассмотреть возможность использования класса StringBuilder для строковых операций, подобных этой. Чтобы использовать его, просто добавьте using System.Text в начало вашего файла.

0 голосов
/ 29 марта 2020

Вот мой взгляд на это:

string text =
    "You only have one chance to make a first impression/" +
    "Consider the source and judge accordingly/" +
    "You can do something for a day you can't imagine doing for a lifetime/" +
    "Are we not drawn onward, we few, drawn onward to new era/" +
    "Never odd or even/" +
    "Madam, I'm Adam/" +
    "What do you mean? It's not due tomorrow, is it?";

string result = new string(
    text
        .Select((c, i) => i % 3 == 0 ? char.ToUpper(c) : c)
        .ToArray());

У вас есть только шанс сделать первое впечатление / совет, который вы хотите сделать, чтобы сделать что-то интересное для вас. Вообразите, что для жизни / жизни мы не пьяны по всему миру, мы мало, покоримся до нового эры / никогда или даже не буду, я - адам / что вы знаете? Это не из-за Моря, это iT?

0 голосов
/ 29 марта 2020

Строки неизменны. Вызов SubString, Remove и Insert будет каждый раз создавать новую строку и бесполезно использовать память.

Простой способ добиться того, о чем вы просите, - преобразовать вашу строку в массив char с помощью ToCharArray, а затем итерации с использованием простого для l oop. Внутри l oop вы можете проверить, является ли символ в позиции буквой и больше или равен ASCII 97. Строчный алфавит начинается с 97.

Для преобразования строчной буквы буква в верхнем регистре просто вычесть 32 из буквы. Поскольку вы модифицируете массив символов, вы не создаете новую строку в памяти.

После завершения использования заглавных букв вы можете снова преобразовать массив символов в строку, используя один из конструкторов String.

var chars = text.ToCharArray();
for (int i = 0; i < chars.Length; i += 3)
{
    if (char.IsLetter(chars[i]) && chars[i] >= 'a')
        chars[i] = (char)(chars[i] - 32);
}

text = new string(chars);
0 голосов
/ 29 марта 2020

Вы можете использовать Substring, чтобы выбрать символ, который вы хотите преобразовать в верхний регистр, а затем использовать Remove, чтобы удалить этот оригинальный символ из строки, и Insert, чтобы добавить заглавный символ обратно. Потому что строки являются неизменяемыми, вам также нужно сохранить промежуточные шаги в переменной, чтобы перенести изменения в следующий цикл.

public static void CaseFlip()
{
    Console.WriteLine("             CaseFlip -- Output");
    Console.WriteLine("==============================================================================");

    var splitString = text.Split('/');
    for (var i = 0; i < splitString.Length; i++)
    {
        var line = splitString[i];
        for (var k = 0; k < line.Length; k += 3)
        {
            var upperCasedCharacter = line.Substring(k, 1).ToUpper();
            line = line.Remove(k, 1).Insert(k, upperCasedCharacter);
        }

        Console.WriteLine(line);
    }

    Console.WriteLine(" ");
}
...