反转字符串的最佳方法

570

我刚刚不得不在C# 2.0中编写一个字符串反转函数(即LINQ不可用),并得出了以下结果:

public string Reverse(string text)
{
    char[] cArray = text.ToCharArray();
    string reverse = String.Empty;
    for (int i = cArray.Length - 1; i > -1; i--)
    {
        reverse += cArray[i];
    }
    return reverse;
}

就我个人而言,我并不热衷于这个函数,并且确信有更好的方法来完成它。有吗?


63
如果您想获得适当的国际支持,翻译可能会非常棘手。例如,克罗地亚语/塞尔维亚语有两个字符的字母“lj”、“nj”等。 “ljudi”的正确反转应该是“idulj”,而不是“idujl”。当涉及到阿拉伯语、泰语等语言时,情况可能更加复杂。 - dbkk
2
我想知道将字符串连接起来是否比初始化临时数组并将结果存储在其中再将其转换为字符串更慢? - The Muffin Man
4
较新的相关帖子:如何反转带有重音字符的字符串? - Jeppe Stig Nielsen
15
请问您所说的“最好”是指什么?速度最快?可读性最高?在多种情况下(如空值检查、多语言等)最可靠?在不同版本的C#和.NET中最易维护? - hypehuman
5
为什么没有内置的直接方法来完成这个简单的任务? - Krishnadas PC
53个回答

1
使用LINQ的Aggregate函数
string s = "Karthik U";
s = s.Aggregate(new StringBuilder(), (o, p) => o.Insert(0, p)).ToString();

1
对于大字符串来说,这个速度非常慢。 - Hoodlum

1

另外一个选项是使用 System.Memory 中的反转函数。

public static string Reverse(string str)
{
    Span<char> span = stackalloc char[str.Length];
    str.AsSpan().CopyTo(span);
    span.Reverse();
    return new String(span);
}

0
我们可以使用两个指针,一个指向字符串的开头,另一个指向字符串的结尾。然后每次交换第i和第j个值,并将ith指针+1,jth指针-1。
string s = Console.ReadLine();
Console.WriteLine(s + "\n");
char[] charArray = s.ToCharArray();
int i = 0, j = s.Length - 1;
while (i < j) {
    char temp = charArray[i];
    charArray[i] = charArray[j];
    charArray[j] = temp;
    i++; j--;
}
string ans = new string(charArray);
Console.WriteLine(ans + "\n");
// Input: hello
// Output: olleh

0
static void Main(string[] args)
{
    string str = "";
    string reverse = "";
    Console.WriteLine("Enter the value to reverse");
    str = Console.ReadLine();
    int length = 0;
    length = str.Length - 1;
    while(length >= 0)
    {
        reverse = reverse + str[length];
        length--;
    }
    Console.Write("Reverse string is {0}", reverse);
    Console.ReadKey();
}

0
     using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication1
{
    class Program
    {     
        public static string ReverseString(string str)
        {
            int totalLength = str.Length;
            int iCount = 0;
            string strRev = string.Empty;
            iCount = totalLength;
            while (iCount != 0)
            {
                iCount--;
                strRev += str[iCount]; 
            }
            return strRev;
        }
        static void Main(string[] args)
        {
            string str = "Punit Pandya";
            string strResult = ReverseString(str);
            Console.WriteLine(strResult);
            Console.ReadLine();
        }
    }

  }

0

我在面试中被问到了类似的问题。这是我的回答,虽然它可能不如其他答案快速。我的问题是这样表达的:“创建一个类,该类可以具有一个方法来倒序打印一个字符串”:

using System;
using System.Collections.Generic;
using System.Linq;

namespace BackwardsTest
{
    class PrintBackwards
    {
        public static void print(string param)
        {
            if (param == null || param.Length == 0)
            {
                Console.WriteLine("string is null");
                return;
            }
            List<char> list = new List<char>();
            string returned = null;
            foreach(char d in param)
            {
                list.Add(d);
            }
            for(int i = list.Count(); i > 0; i--)
            {
                returned = returned + list[list.Count - 1];
                list.RemoveAt(list.Count - 1);
            }
            Console.WriteLine(returned);
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            string test = "I want to print backwards";
            PrintBackwards.print(test);
            System.Threading.Thread.Sleep(5000);
        }
    }
}

-1
string A = null;
//a now is reversed and you can use it
A = SimulateStrReverse.StrReverse("your string");

public static class SimulateStrReverse
{
    public static string StrReverse(string expression)
    {
        if (string.IsNullOrEmpty(expression))
            return string.Empty;

        string reversedString = string.Empty;
        for (int charIndex = expression.Length - 1; charIndex >= 0; charIndex--)
        {
            reversedString += expression[charIndex];
        }
        return reversedString;
    }
}

1
请解释答案 :) - Saghir A. Khatri
2
这种方式非常低效,因为有大量的字符串拼接。尝试使用 StringBuilder 替代。 - Rezo Megrelidze

-1
可能使用.NET 6.0或.NET 7.0是最短的方式。
string name = Console.ReadLine();
Console.WriteLine(string.Join("", name.Reverse().ToArray()));

这不是最短的方法。而且为什么要介绍任何“Console”操作,当原帖中没有包含它们呢?string.Concat(name.Reverse())更简洁、更短。 - Enigmativity
在其他答案中已经提出了在IEnumerable上使用Linq的Reverse()扩展方法。 - Kai Thoma

-2

这是用于反转字符串的代码

public Static void main(){
    string text = "Test Text";
    Console.Writeline(RevestString(text))
}

public Static string RevestString(string text){
    char[] textToChar = text.ToCharArray();
    string result= string.Empty;
    int length = textToChar .Length;
    for (int i = length; i > 0; --i)
    result += textToChar[i - 1];
    return result;
}

3
请勿只贴出代码片段,需说明代码的功能,并解释为何选择了这种特定的方法。 - Karl-Henry Martinsson
1
这不是基本上与OP说他正在寻找更好的方法来完成的代码完全相同吗? - d219

-3

这非常简单

static void Reverse()
    {
        string str = "PankajRawat";
        var arr = str.ToCharArray();
        for (int i = str.Length-1; i >= 0; i--)
        {
            Console.Write(arr[i]);
        }
    }

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