在句子中反转每个单词的简便方法

10

示例:

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

我认为我需要迭代每个单词,然后迭代每个单词的每个字母。

我的方法运行良好。但我需要更简单/更短的方法。

C# 代码:

  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
9个回答

17

好的,这里是一个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代码单元的顺序。虽然适用于玩耍,但您需要了解为什么不建议在真实数据中使用它。

Enumerable.Reverse 的碰撞真的是一个问题/不可取吗?你的函数除了延迟执行之外,也满足 Enumerable.Reverse 的契约。而且,由于 string 是不可变的并且已经评估了延迟执行是不可观察的。这是因为处理 Unicode 问题的此函数版本将无法满足 Enumerable.Reverse 的契约吗? - CodesInChaos
@CodeInChaos:不是因为代码的哪个版本会被调用不明显,而是由于在不同嵌套级别使用using指令可能会导致奇怪的情况。这比普通的重载解析更难跟踪 :) - Jon Skeet

5
为了反转一个字符串,我使用以下代码:
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() ) ));

请注意,这段代码在处理某些Unicode特性时效果不佳。它至少有两个问题:
1. UTF-16编码时,基本平面之外的Unicode字符需要两个`char`。颠倒它们会破坏编码。这相对容易解决,因为代理是一个简单的代码点范围,在未来的Unicode版本中不会改变。
2. 组合字符序列。例如,可以通过在基本字符后面写入组合重音符创建带重音符的字符。这个问题很难解决,因为新的组合字符可能会在未来的Unicode版本中添加。零宽连接器将导致类似的问题。

1
为什么我找不到 string.Reverse() - Javed Akram
@JavedпәЊжІҰжњ‰String.Reverse()ж–№жі•гЂ‚еЏҒжњ‰Enumerable.Reverse()扩展方法。иү™йњЂи¦ЃењЁж‚Ёзљ„д»Ә码文件中添加using System.Linq;гЂ‚ - CodesInChaos
1
你能在你的回答中加上那个缺失的 using 吗? - Roland Illig
@RolandIllig 为什么?他们明确表示“Reverse()函数是LINQ的一部分”。 - BCdotWEB

0
//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

我在这里使用了异或运算进行交换 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

你可以将LINQ用作

String newStr = new String( str.Reverse().ToArray() );

替换内部的foreach,是的。strrev += " " + word.Reverse(); 然后去掉结果字符串的第一个空格。 - Vincent Vancalbergh
String.Reverse会将整个字符串反转,而不是每个单词。 - mcabral
@mcabral - 抱歉。我编辑了我的答案,使其更加明确。我并不是指在拆分之前将整个字符串反转。 - Sachin Shanbhag
1
@mcabral 字符串是不可变的。因此它不能原地翻转字符串。@Sachin String.Reverse()不存在。Reverse只是一个来自linq的扩展方法,它将返回一个反转的IEnumerable<char> - CodesInChaos

0

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);
    }

-2
    static void Main(string[] args)
    {
        string str = "Hi how are you";
        char[] char_arr= str.ToCharArray();

        string finalstr = "";           
        string eachwords = "";
        string tempreverseword = "";
        int char_length = char_arr.Length;
        for (int i = 0; i < char_arr.Length; i++)
        {

            if (char_arr[i].ToString() == " " || i == char_length-1)
            {
                if (i == char_length - 1)
                {
                    eachwords += char_arr[i] + "";
                }                   
                char[] revchar_arr = eachwords.ToCharArray();
                for (int j = revchar_arr.Length-1; j >=0; j--)
                {
                    tempreverseword += revchar_arr[j];
                }
                finalstr += tempreverseword+" ";
                tempreverseword = "";                    
                eachwords = "";
            }               
            else
            {
                eachwords += char_arr[i] + "";
            }               
        }
        Console.WriteLine(finalstr);
        Console.ReadKey();

    }

虽然您的代码看起来非常酷,但我们也希望在这里加入一两句话来介绍它。比如为什么它更好。我邀请您阅读这篇指南:“如何撰写一个好答案”,链接在此:https://stackoverflow.com/help/how-to-answer - Guillaume Raymond
1
代码看起来一点也不“很酷”。它使用了太多的变量,性能也非常糟糕。 - Roland Illig

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

string[] strArray = str.Split(' ');

string[] strArrayReversed = new string[strArray.Length];

for(int i = 0; i < strArray.Length; i++) 
{

   char[] eachWordLetter = strArray[i].ToCharArray();

   Array.Reverse(eachWordLetter);

   strArrayReversed[i] = new string(eachWordLetter);
}

string newReversedString = String.Join(" ", strArrayReversed);

Console.WriteLine(newReversedString);
Console.ReadLine();

-3
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();
            }
        }       

1
请你能否添加一些解释。 - Sagar P. Ghagare
1
此外,问题中提到了“但我需要简单/简短的方法”- 但这比他们已经拥有的方法更长,看起来也不更容易。 - Wai Ha Lee
1
你还吞噬了所有的异常 - 这很糟糕,因为如果有问题,调用者就无法知道。 - Wai Ha Lee

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接