#c#
Вопрос:
У меня тренировка по C#, и я хочу знать, как я могу поменять местами первый и последний символы в каждом слове предложения и прописные буквы. Я создал массив строк, который представляет каждое слово, и во внутреннем цикле for я повторяю каждый символ в каждом слове. Вот мой код.
using System;
namespace ConsoleApp11
{
class Program
{
static void Main(string[] args)
{
string text = "Hello world";
string[] words = text.Split(" ");
string output = "";
for(int i = 0; i < words.Length; i )
{
for(int j = 0; j < words[i].Length; j )
{
if (char.IsUpper(words[i][j]))
{
output = char.ToLower(words[i][j]);
}
else
{
output = words[i][j];
}
}
output = " ";
}
Console.WriteLine(output);
}
}
}
Комментарии:
1. Возможно, вам будет проще использовать только один цикл и преобразовать слово в массив символов, поменять местами начало/конец и преобразовать его обратно.
foreach(var word in words)
будет перечислять слова.word.ToCharArray()
даст вам массив символов, с помощью которого вы можете использовать типичную методику «временная переменная символов» для выполнения подкачки, и вы можете преобразовать массив символов обратно в строку, передав его в конструктор строкnew string(someCharArray)
. Вы можете использовать статический символ. Метод ToLower для изменения символа на его эквивалент в нижнем регистре2. Кроме того, вы можете пропустить замену временных переменных, если хотите, потому что нужные символы доступны в
word
строке, а строки могут быть проиндексированы как массивы для создания символов.word[0]
это первый символ слова. В современном c#word[^1]
это последний символ слова, поэтому вы можете скопировать первый/последний символ слова в массив символов в последней/первой позиции соответственно
Ответ №1:
Потому что сегодня воскресенье :-), вот полный код (мои объяснения были трудными):
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
string output = "ABCD EFGH IJKL";
string[] outputs = output.Split(' ');
char[] chars;
string first,last;
string flower,llower;
string result = string.Empty;
for (int i = 0; i < outputs.Length; i )
{
chars = outputs[i].ToCharArray();
first = new string(chars[0], 1);
last = new string(chars[chars.Length - 1], 1);
flower = first.ToLower();
llower = last.ToLower();
chars[chars.Length - 1] = flower.ToCharArray()[0];
chars[0] = llower.ToCharArray()[0];
result = new string(chars);
result = " ";
}
Console.WriteLine(output);
Console.WriteLine(result);
Console.ReadLine();
}
}
}
Результат: dBCa hFGe lJKi
Комментарии:
1. Используемый вами метод Split() не разбивается на символы, которые обычно встречаются в тексте, такие как запятая, точка, восклицательный знак, вопросительный знак, скобки и т.п., И не будет работать с текстом, содержащим эти символы. Если вы разделитесь на несколько символов, вы не сможете с уверенностью воссоздать символы между каждым словом.
2. Похоже, вы в какой-то степени сосредоточены на оптимизации кода для повышения скорости, используя массив символов и ограничивая время записи на консоль. В этом случае вам не следует преобразовывать первый и последний символы в строку, а для создания результата следует использовать StringBuilder или другой массив символов (или аналогичный).
3. Да, вы отчасти правы, я не сосредоточен на оптимизации кода, но я просто хотел привести пример по школьному вопросу. Код должен быть адаптирован, прежде всего, он должен разделяться так, как он хочет, я был сосредоточен на обмене и простом способе это сделать. Разделение не является частью ответа, но я скопировал весь код …
Ответ №2:
Как мне записать в нижнем регистре и поменять местами первый и последний символы в каждом слове.
Решение с использованием регулярного выражения
Мы могли бы использовать метод Split() строки или регулярного выражения для разделения на символы, не содержащие слов, но тогда мы не смогли бы выводить правильные символы между каждым словом, если бы мы не разделяли только один символ.
using System;
using System.Text.RegularExpressions;
namespace CS_Regex {
class Program {
static void Main(string[] args) {
// Match words using a regular experession
string match_word = @"(w )";
string match_non_word = @"([^w]*)";
string pattern = match_non_word match_word match_non_word;
Regex rx = new Regex(pattern, RegexOptions.Compiled);
// Do the match on example data
string data = "Hello world";
MatchCollection matches = rx.Matches(data);
// Output the matches
foreach (Match match in matches) {
// Get the text before and after the word
string non_word_before = match.Groups[1].ToString();
string non_word_after = match.Groups[3].ToString();
// Get the matched word
string word = match.Groups[2].ToString();
// Lower case the first and last characters and swap them
string firstchar = (word.Length > 0) ? $"{char.ToLower(word[0])}" : "";
string lastchar = (word.Length > 1) ? $"{char.ToLower(word[word.Length - 1])}" : "";
string middle = (word.Length > 2) ? word.Substring(1, word.Length - 2) : "";
string newword = lastchar middle firstchar;
// Output the new word
Console.Write(non_word_before newword non_word_after);
}
} // Main
} // class
} // namespace
Вывод из предложенного решения
oellh dorlw
Ссылки
Язык регулярных выражений — Краткий справочник
Класс регулярных выражений
Регулярное выражение.Метод Сопоставления
Комментарии:
1. Похоже на домашнее задание; может быть, уточнить, так ли это, а затем предоставить образование, а не решение..
Ответ №3:
одна из идей состоит в том, чтобы преобразовать каждую строку в массив символов, затем для каждого массива символов получить первый и последний символ и преобразовать эти символы в строку (одного символа), чтобы использовать нижнюю функцию. Затем замените первую и последнюю буквы нижними символами, инвертировав индекс 0 с последним индексом, чтобы поменять местами.
Пример для первой буквы (БЕЗ замены только для объяснения):
string output = "ABCD";
char[] chars = output.ToCharArray();
string firt = new string(chars[0],1);
string lower = firt.ToLower();
string result = output.Replace(chars[0].ToString(), lower.ToString());
Для замены первой буквы на последнюю
Вот полный код для первой буквы: результат — «BCDa». Что касается последнего письма, то это та же идея
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
string output = "ABCD";
char[] chars = output.ToCharArray();
string firt = new string(chars[0],1);
string lower = firt.ToLower();
chars[chars.Length-1] = lower.ToCharArray()[0];
string result = new string(chars);
Console.WriteLine(output);
Console.WriteLine(result);
Console.ReadLine();
}
}
}