Простой способ перевернуть каждое слово в предложении - PullRequest
7 голосов
/ 22 марта 2011

Пример:

string str = "I am going to reverse myself.";
string strrev = "I ma gniog ot esrever .flesym"; //An easy way to achieve this

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

То, что я сделал, прекрасно работает. Но мне нужен легкий / короткий путь.

C # CODE:

  string str = "I am going to reverse myself.";
  string strrev = "";

  foreach (var word in str.Split(' '))
  {
     string temp = "";
     foreach (var ch in word.ToCharArray())
     {
         temp = ch + temp;
     }
     strrev = strrev + temp + "";
  }
  Console.WriteLine(strrev);  //I ma gniog ot esrever .flesym

Ответы [ 7 ]

16 голосов
/ 22 марта 2011

Хорошо, вот решение LINQ:

var reversedWords = string.Join(" ",
      str.Split(' ')
         .Select(x => new String(x.Reverse().ToArray())));

Если вы используете .NET 3.5, вам также необходимо преобразовать обратную последовательность в массив:

var reversedWords = string.Join(" ",
      str.Split(' ')
         .Select(x => new String(x.Reverse().ToArray()))
         .ToArray());

Другими словами:

  • Разделение на пробелы
  • Для каждого слова создайте новое слово, обрабатывая ввод как последовательность символов, переворачивайте эту последовательность, превращайте результат вмассив, а затем вызовите string(char[]) конструктор
  • В зависимости от версии платформы, вызовите ToArray() для последовательности строк, так как .NET 4 имеет больше доступных перегрузок
  • Вызов string.Join длярезультат, чтобы снова соединить перевернутые слова.

Обратите внимание, что этот способ перестановки строки несколько громоздок.Для этого легко создать метод расширения:

// Don't just call it Reverse as otherwise it conflicts with the LINQ version.
public static string ReverseText(this string text)
{
    char[] chars = text.ToCharArray();
    Array.Reverse(chars);
    return new string(chars);
}

Обратите внимание, что это все еще"неправильно" по-разному - он не справляется с объединением символов, суррогатных пар и т. Д.Он просто переворачивает последовательность кодовых единиц UTF-16 в исходной строке.Хорошо для игры, но вы должны понимать, почему не стоит использовать его для реальных данных.

5 голосов
/ 22 марта 2011

Для обращения строки я использую:

new String( word.Reverse().ToArray() )

Функция Reverse() является частью LINQ и работает, потому что String реализует IEnumerable<char>.Его результатом является еще один IEnumerable<char>, который теперь необходимо преобразовать в строку.Вы можете сделать это, вызвав ToArray(), который дает char[], а затем передать его в конструктор string.

Таким образом, полный код становится:

string s="AB CD";
string reversed = String.Join(" ",
    s.Split(' ')
     .Select(word => new String( word.Reverse().ToArray() ) ));

Обратите внимание, что этот код не работает с определенными функциями Юникода.У него есть как минимум две проблемы:

  1. Символам Юникода вне базовой плоскости требуется два char с при кодировании UTF-16.Обращение их нарушает кодировку.Это относительно легко исправить, поскольку существует только ограниченное количество символов, запускающих такую ​​последовательность (16, если я правильно помню), и это, скорее всего, не будет расширено в будущих версиях Unicode.
  2. Связывание последовательностей символов.Например, можно создать символы с акцентом, написав основной символ и связующий акцент за ним.Эту проблему сложно обойти, поскольку новые будущие символы могут быть добавлены в будущих версиях Юникода.
0 голосов
/ 13 января 2019
public static void ReverseEachWordString(string abc)
        {
            int start_index = 0, end_index = abc.Length - 1;
            int i = 0, j = 0;
            char[] arr = abc.ToCharArray();
            try
            {
                while (start_index < end_index)
                {
                    if (arr[start_index] == ' ')
                    {
                        Console.WriteLine(arr[start_index]);
                        start_index++;
                        i = start_index;
                    }
                    else
                    {
                        if (arr[i] != ' ')
                        {
                            if (i == end_index)
                            {
                                i++;
                                for (j = i - 1; j >= start_index; j--)
                                {
                                    Console.WriteLine(arr[j]);
                                }
                                break;
                            }
                            else
                                i++;
                        }
                        else
                        {
                            for (j = i - 1; j >= start_index; j--)
                            {
                                Console.WriteLine(arr[j]);
                            }
                            i++;
                            start_index = i - 1;
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                ex.Message.ToString();
            }
        }       
0 голосов
/ 16 января 2018
//Without Extension Methods Like: Split, ToCharArray, etc..

public string ReverseString(string str="Hai How Are You?"){
    var FullRev="", 
    var wordRev="";
    for(i=0;i<=str.length;i++){
        if(str[i]==" " || i==str.length){
            FullRev=FullRev+" "+wordRev; //FullRev=wordRev+" "+FullRev; 
            wordRev="";
        }else{
            wordRev=str[i]+wordRev;
        }
    }
    return FullRev;
} 
//Result "iaH woH erA ?uoY"
0 голосов
/ 11 февраля 2015

Я использовал XOR для обмена здесь http://en.wikipedia.org/wiki/XOR_swap_algorithm

X := X XOR Y
Y := X XOR Y
X := X XOR Y

C #:

public  string ReverseWords(string str)
    {
        StringBuilder strrev = new StringBuilder();
        StringBuilder reversedword = new StringBuilder();

        foreach (var word in str.Split(' '))
        {
            char[] singlesentence = word.ToCharArray();
            int j = singlesentence.Length / 2;
            if (j > 0)
            {
                for (int i = singlesentence.Length - 1, c = 0; i == j; c = c + 1, i = i - 1)
                {


                    singlesentence[c] = (char)(singlesentence[c] ^ singlesentence[i]);
                    singlesentence[i] = (char)(singlesentence[c] ^ singlesentence[i]);
                    singlesentence[c] = (char)(singlesentence[c] ^ singlesentence[i]);

                }
            }

            strrev.Append(singlesentence);
            strrev.Append(" ");
        }
        return strrev.ToString();
    }
0 голосов
/ 25 апреля 2012

1 - метод расширения для обращения строки

  public static string reverseString(this string description) {

        char[] array = description.ToCharArray().Reverse().ToArray();

        return new string(array);
    }

2 - обращение массива и обращение всей строки этого массива

    public static string reverseText(this string description) {

      string [] reversetext=  description.Split(' ').Select(i => i.ToString().reverseString()).Reverse().ToArray();

      return string.Join(" ", reversetext);
    }
0 голосов
/ 22 марта 2011

вы можете использовать linq как

String newStr = new String( str.Reverse().ToArray() );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...