2017-08-21 24 views
-4

我正在嘗試製作一個反轉C#文本的程序。我是C#的新手,我不太清楚如何做到這一點。我知道我必須從文本框中獲取輸入並將其轉換,但我不知道該怎麼做。我看到的一些網站是爲VB或已關閉。在C#中反轉文本#

我也想有另一個文本框顯示單詞的長度

namespace WindowsFormsApp1 
{ 
public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void Form1_Load(object sender, EventArgs e) 
    { 

    } 

    private void button1_Click(object sender, EventArgs e) 
    { 

     textBox2.Text = textBox1.Text; 

     textBox3.Text = textBox1.Text + "4"; 
    } 

    private void button2_Click(object sender, EventArgs e) 
    { 
     textBox2.Text = " "; 
     textBox3.Text = " "; 
    } 

    private void button3_Click(object sender, EventArgs e) 
    { 
     Application.Exit(); 
    } 


} 
} 

我能找到這個代碼,但我不能確定如何使其適合與我

private void btnReverseString_Click(System.Object sender, System.EventArgs e) 
{ 
    string OriginalString = txtOriginalString.Text; 
    string ReverseString = ""; 
    for (int i = 0; i <= OriginalString.Length - 1; i++) 
    { 
     ReverseString += OriginalString[OriginalString.Length - 1 - i]; 
    } 
    txtReverseString.Text = ReverseString; 
} 
+0

我同意它是重複的,我不投票關閉作爲愚蠢只因爲**沒有令人滿意的答案**在那篇文章中。如果其他人找到更好的投資,我會投票結束。 –

回答

2

在首先,一些天真的解決方案:

var reversedText = new String(text.Reverse().ToArray()); 

或者:

var reversedText = String.Concat(text.Reverse()); 

或者:

var chars = text.ToCharArray(); 
Array.Reverse(chars); 
var reversedText = new String(chars); 

然而它們dont't使用Unicode工作得很好,因爲石墨烯可以由多於一個char(和一個統一代碼點可以由可以被編碼爲多個代碼單元 - 這是char類型的正確名稱)。一個例子?

string text = "à"; 
Debug.Assert(text.Length == 2); 

,因爲它是由字符+ U0041大寫拉丁字母A和+ U0300 COMBINING重音符組成的這2。如果你簡單地反轉字符串,那麼你將不會獲得正確的文本,因爲通過組合字符,編碼文本和Unicode代理,順序很重要,必須保留。我建議閱讀How can I perform a Unicode aware character by character comparison?

稍微好一點的版本:

var elements = new List<string>(); 
var enumerator = StringInfo.GetTextElementEnumerator(text); 
while (enumerator.MoveNext()) 
    elements.Add((string)enumerator.Current); 

var reversedText = String.Concat(elements.Reverse()); 

它仍然遠遠是完美的,你可能要包裝IEnumeratorIEnumerable<string>使用假設AsEnumerable()擴展方法寫這篇文章:

var elements = StringInfo.GetTextElementEnumerator(text).AsEnumerable(); 
var reversedText = String.Concat(elements.Reverse()); 

請注意,它不是最終解決方案,因爲有一些代碼點必須在speci fic職位,他們有不同的和特殊的含義(例如RTL標記)。另一個真實世界的例子我喜歡舉:Why are emoji characters like ‍‍‍ treated so strangely in Swift strings?

0

好老C++風格

string input = "hello world" 
string output = string.Empty; 

for(int i = input.Count(); i >= 0; i--) 
{ 
    output += input[i]; 
} 

適應您的代碼:

private void btnReverseString_Click(System.Object sender, System.EventArgs e) 
{ 
    string OriginalString = txtOriginalString.Text; 
    string ReverseString = ""; 
    for (int i = OriginalString.Length; i >= 0; i--) 
    { 
     ReverseString += OriginalString[i]; 
    } 
    txtReverseString.Text = ReverseString; 
} 

你也可以使用LINQ:t.Reverse()。這給你一個枚舉,所以你需要實例化一個新的字符串從IEnumerable<char>