【问题标题】:C#: Reverse the words in sentenceC#:反转句子中的单词
【发布时间】:2021-01-18 04:40:59
【问题描述】:

下面的代码如果对一个句子中的单词进行反转,则句子中的单词顺序相同但单词会被反转

    using System;
    using System.Text;
    
    namespace reverse_a_string
    {
        class Program
        {
            static void Main(string[] args)
            {
                Console.Write("Enter a string: ");
                string S = Console.ReadLine();
                string[] sep = S.Split(" ");
                StringBuilder Wrev = new StringBuilder(); //Word reverse
                StringBuilder Srev = new StringBuilder(); //Sentence reverse
                for (int j=0;j<sep.Length;j++)
                {                
                    for (int i = sep[j].Length - 1; i >= 0; i--)
                    {
                        Wrev.Append(sep[j][i]);                   
                    }
                    Srev.Append(Wrev);
                    Wrev.Clear();
                    Wrev.Append(" ");
                }
                Console.WriteLine(Srev);
                        
            }
        }
    }

【问题讨论】:

标签: c#


【解决方案1】:

对于简单的文本,您可以使用SplitReverseConcatJoin

var words = Console.ReadLine()
     .Split()
     .Select(x => string.Concat(x.Reverse()));

Console.WriteLine(string.Join(" ", words));

输出

Enter a string: asd sdf dfg fgh
dsa fds gfd hgf

对于复杂的 Unicode,您需要更精确地对字符进行分组。但是,您可以利用GetTextElementEnumerator

返回一个遍历 a 的文本元素的枚举器 字符串。

给定

public static IEnumerable<string> ToElements(this string source)
{
   var enumerator = StringInfo.GetTextElementEnumerator(source);
   while (enumerator.MoveNext())
      yield return enumerator.GetTextElement();
}

用法

var words = Console.ReadLine()
   .Split()
   .Select(x => string.Concat(x.ToElements().Reverse()));

【讨论】:

    【解决方案2】:
        static void Main(string[] args)
        {
            //method 1
            Console.Write("Enter a string: ");
            string sentence = Console.ReadLine();
            string[] words = sentence.Split(" ");
            StringBuilder destination = new StringBuilder(); //Sentence reverse
            foreach (string word in words)
            {
                destination.Append(string.Concat(new string(word.Reverse().ToArray()), " "));
            }
            Console.WriteLine(destination);
    
            //method 2 but need import System.Linq namespace.
            var reversedWords = string.Join(" ", sentence.Split(' ').Select(x => new String(x.Reverse().ToArray())));
            Console.WriteLine(reversedWords);
        }
    

    【讨论】:

      【解决方案3】:

      让我们从定义开始;假设

      Word 是由字母撇号

      组成的非空序列

      我们可以借助正则表达式(以及一小撮Linq - Reverse())实现一个简单的解决方案:我们所要做的就是@987654322 @每个单词都有其Reversed 表示。

      代码:

        using System.Linq;
        using System.Text.RegularExpressions;
      
        ...
      
        private static string WordReverse(string value) => 
          Regex.Replace(value ?? "", @"[\p{L}_]+", m => string.Concat(m.Value.Reverse()));
      

      演示:

        string[] tests = new string[] {
          "Text (на русском)",
          "Simple test.",
          "Another \"text\": punctuation!"
        };
       
        Console.Write(string.Join(Environment.NewLine, tests
          .Select(test => $"{test,-30} => {WordReverse(test)}")));
      

      结果:

      Text (на русском)              => txeT (ан мокссур)
      Simple test.                   => elpmiS tset.
      Another "text": punctuation!   => rehtonA "txet": noitautcnup!
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-03-09
        • 1970-01-01
        • 2013-01-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多