轻松翻转句子中的每个单词

Jav*_*ram 7 c# string

例:

string str = "I am going to reverse myself.";
string strrev = "I ma gniog ot esrever .flesym"; //An easy way to achieve this
Run Code Online (Sandbox Code Playgroud)

因为我认为我必须遍历每个单词然后每个单词的每个字母.

我做的很好.但我需要轻松/简短的方式.

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
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 16

那么,这是一个LINQ解决方案:

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

如果您使用的是.NET 3.5,则还需要将反转序列转换为数组:

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

换一种说法:

  • 在空格上分开
  • 对于每个单词,通过将输入视为一个字符序列,反转该序列,将结果转换为数组,然后调用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);
}
Run Code Online (Sandbox Code Playgroud)

请注意,这仍然是各种各样的"错误" - 它不能处理组合字符,代理对等.它只是反转原始字符串中的UTF-16代码单元序列.很好玩,但你需要理解为什么将它用于真实数据不是一个好主意.


Cod*_*aos 5

要反转我使用的字符串:

new String( word.Reverse().ToArray() )
Run Code Online (Sandbox Code Playgroud)

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() ) ));
Run Code Online (Sandbox Code Playgroud)

请注意,此代码不适用于某些unicode功能.它至少有两个问题:

  1. char当UTF-16编码时,基本平面外的Unicode字符需要两个s.反转它们会破坏编码.这是相对容易修复的,因为只有有限数量的字符启动这样的序列(如果我没记错的话,则为16),这很可能在将来的unicode版本中不会扩展.
  2. 绑定字符序列.例如,可以通过编写基本字符和背后的绑定重音来创建重音字符.这个问题很难解决,因为可以在将来的unicode版本中添加新的组合字符.