WeIrD StRiNg CaSe codewars

Появилась проблема при решении данной задачи на codewars c#. Суть задачи заключается в принятии строки и возвращении той же строки со всеми четными индексированными символами в каждом слове в верхнем регистре и всеми нечетными в нижнем регистре. К примеру:

1)Input: "This"
  Output:"ThIs"

2)Input: "This is a test"
  Output: "ThIs Is A TeSt"

Код проходит все базовые тесты, но как только дело доходит до доп. тестов он резко начинает будто сходить с ума и поднимать всё, что попадётся на его пути , пример:

№1
Input: "Ecmkjc y fjbhxtfd yavhpb c i abh ftg"
Ожидается:"EcMkJc Y FjBhXtFd YaVhPb C I AbH FtG"
Вывод кода: "ECMKJC Y FjBHXTFD YaVhPB C I AbH FTG"

№2
Input: "Wauf qa lakuz z ooehf pg yb fds ydf rz qye"
Ожидается:"WaUf Qa LaKuZ Z OoEhF Pg Yb FdS YdF Rz QyE"
Ragemod моего кода:"WaUf Qa LaKUZ Z OOEHF Pg Yb FdS YdF RZ QYE"

Сам код(проверял даже на бумаге, честно говоря ошибки не нашёл):

using System;

public class Kata
{
  public static string ToWeirdCase(string s)
  {
  char[] arr = s.ToCharArray(); 
  for (int i = 0; i < s.Length; i += 2)
  {
    if (arr[i] != ' ')
      {  
        arr[i] = char.ToUpper(arr[i]); 
      }
    else
      {
        i -= 1;      
      }
  }
  return new string(arr); ; 
  }
}

Ответы (3 шт):

Автор решения: shalor1k

Спасибо всем за комментарии и советы, @tym32167 ваш способ рабочий(огромное спасибо), я опубликую собственное решение (до которого мне помогла додуматься 3-я чашка кофе), которое чуть больше будет понятно новичку, нежели тернарный оператор, да простят меня Стив Макконнелл "Совершенный код" и Боб Мартин "Чистый код"

public class Kata
{
    public static string ToWeirdCase(string s)
    {
        char[] arr = s.ToCharArray();

        for (int i = 0; i < s.Length; i += 2)
        {
            if (arr[i] != ' ')
            {
                if (s.Length - i == 1)
                {
                    arr[i] = char.ToUpper(arr[i]);
                }
                else
                {
                    arr[i] = char.ToUpper(arr[i]);
                    arr[i + 1] = char.ToLower(arr[i + 1]);
                }
            }
            else
            {
                i -= 1;
            }
        }
        return new string(arr); ;
    }
}
→ Ссылка
Автор решения: tym32167

Слишком много мудрите. Вот простой и понятный вариант

public static string ToWeirdCase(string s)
{
    char[] arr = s.ToCharArray();
    for (int i = 0; i < s.Length; i++)
    {
        if (i % 2 == 0)
            arr[i] = char.ToUpper(arr[i]);
        else
            arr[i] = char.ToLower(arr[i]);
    }
    return new string(arr); ;
}

Если каждое слово начинать с большой буквы, можно изобразить алгоритм, где каждое слово обрабатывается отдельно, например

public static string ToWeirdCase(string s)
{
    char[] arr = s.ToCharArray();
    int index = 0;      
    while (index < arr.Length)
    {
        // пропускаем всё, что не буквы
        while (index < arr.Length && !char.IsLetter(arr[index]))
            index++;
            
        // обработка слова
        int counter = 0;            
        while (index < arr.Length && char.IsLetter(arr[index]))
        {
            if (counter % 2 == 0)
                arr[index] = char.ToUpper(arr[index]);
            else
                arr[index] = char.ToLower(arr[index]);
            index++;
            counter++;
        }
    }
    return new string(arr);
}
→ Ссылка
Автор решения: aepot

В копилку, моя версия с использованием StringBuilder.

public static string ToWeirdCase(string s)
{
    StringBuilder sb = new StringBuilder();
    bool state = true;
    foreach (char c in s)
    {
        if (char.IsLetter(c))
        {
            sb.Append(state ? char.ToUpper(c) : char.ToLower(c));
            state = !state;
        }
        else
        {
            sb.Append(c);
            state = true;
        }
    }
    return sb.ToString();
}
→ Ссылка