Easy way to reverse each word in a sentence
Example:
string str = "I am going to reverse myself.";
string strrev = "I ma gniog ot esrever .flesym"; //An easy way to achieve this
As I think I have to iterate through each word and then each letter of every word.
What I have done works fine. But I need easy/short w开发者_JS百科ay.
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
Well, here's a LINQ solution:
var reversedWords = string.Join(" ",
str.Split(' ')
.Select(x => new String(x.Reverse().ToArray())));
If you're using .NET 3.5, you'll need to convert the reversed sequence to an array too:
var reversedWords = string.Join(" ",
str.Split(' ')
.Select(x => new String(x.Reverse().ToArray()))
.ToArray());
In other words:
- Split on spaces
- For each word, create a new word by treating the input as a sequence of characters, reverse that sequence, turn the result into an array, and then call the
string(char[])
constructor - Depending on framework version, call
ToArray()
on the string sequence, as .NET 4 has more overloads available - Call
string.Join
on the result to put the reversed words back together again.
Note that this way of reversing a string is somewhat cumbersome. It's easy to create an extension method to do it:
// 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);
}
Note that this is still "wrong" in various ways - it doesn't cope with combining characters, surrogate pairs etc. It simply reverses the sequence of UTF-16 code units within the original string. Fine for playing around, but you need to understand why it's not a good idea to use it for real data.
To reverse a string I use:
new String( word.Reverse().ToArray() )
The Reverse()
function is part of LINQ and works because String implements IEnumerable<char>
. Its result is another IEnumerable<char>
which now needs to be converted to string. You can do that by calling ToArray()
which gives a char[]
and then pass that into the constructor of string
.
So the complete code becomes:
string s="AB CD";
string reversed = String.Join(" ",
s.Split(' ')
.Select(word => new String( word.Reverse().ToArray() ) ));
Note that this code doesn't work well with certain unicode features. It has at least two problems:
- Unicode characters outside the basic plane need two
char
s when UTF-16 encoded. Reversing them breaks the encoding. This is relatively easy to fix since surrogates are a simple range of codepoints which will not change in future unicode versions. - Combining character sequences. For example it's possible to create accented characters by writing the base character and a combining accent behind it. This problem is hard to work around since new combining characters can be added with future unicode versions. Zero-width-joiner will cause similar complications.
1 - Extension method to reverse a string
public static string reverseString(this string description) {
char[] array = description.ToCharArray().Reverse().ToArray();
return new string(array);
}
2 - Reversing an array and reversing all string of this array
public static string reverseText(this string description) {
string [] reversetext= description.Split(' ').Select(i => i.ToString().reverseString()).Reverse().ToArray();
return string.Join(" ", reversetext);
}
I used XOR for swapping from here http://en.wikipedia.org/wiki/XOR_swap_algorithm
X := X XOR Y
Y := X XOR Y
X := X XOR Y
the C# is:
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();
}
//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"
you can use linq as
String newStr = new String( str.Reverse().ToArray() );
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();
}
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();
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();
}
}
精彩评论