Как посимвольно пройтись по массиву
Пишу приложение на c# c помощью windows forms, суть которого заключается в подсчете гласных, согласных, цифр и знаков препинания в тексте, который вводится либо вручную пользователем либо считывается из файла

При нажатии на кнопку заменить в левом текстовом поле должен быть результат с количеством вышеуказанных знаков. Я придумал следующий алгоритм для кнопки заменить: мы берем текст из textBoxInput и заносим его в массив, далее выполняем проходы по массиву, и получаем каждую букву в отдельности (но на практике это не работает, как я понял мы получаем не каждую букву в отдельности, а весь текст целиком)
Код обработчика кнопки заменить:
private void buttonReplace_Click(object sender, EventArgs e)
{
if (textBoxInput.Text == "")
{
MessageBox.Show("Вы не ввели текст!", "Ошибка",
MessageBoxButtons.OK,
MessageBoxIcon.Information);
}
else
{
int glasnie = 0;
int soglasnie = 0;
int znakiPrep = 0;
int numbers = 0;
int count = textBoxInput.Text.Length;
string[] mas = new string[textBoxInput.Text.Length];
for (int index = 0; index < count; index++)
{
if (mas[index] == "а" || mas[index] == "о" || mas[index] == "и"
|| mas[index] == "е" || mas[index] == "ё" || mas[index] == "э"
|| mas[index] == "ы" || mas[index] == "у"
|| mas[index] == "ю" || mas[index] == "я")
{
glasnie++;
}
}
textBoxOutput.Text = textBoxOutput.Text + "Гласных: " + glasnie;
}
}
Как пройтись по массиву посимвольно? Прошу объяснить максимально просто, так как с# только начал изучать:)
Ответы (2 шт):
Вместо
for (int index = 0; index < count; index++)
Нужно использовать
foreach (char c in textBoxInput.Text)
Такой класс для анализа текста
class TextAnalyzer
{
private readonly char[] _chars;
private readonly char[] _vowels;
private List<char> _letters;
private List<char> _digits;
private List<char> _others;
public TextAnalyzer(char[] chars)
{
_chars = chars;
_vowels = new char[] { 'а', 'А', 'е', 'Е', 'ё', 'Ё', 'и', 'И',
'о', 'О', 'у', 'У', 'ы', 'Ы', 'э', 'Э', 'ю', 'Ю', 'я', 'Я' };
_letters = new List<char>();
_digits = new List<char>();
_others = new List<char>();
SetResults();
}
//число согласных
public int ConsonantsCount { get; private set; }
//число гласных
public int VowelsCount => _letters.Count - ConsonantsCount;
//цифры
public int DigitsCount => _digits.Count;
//остальные
public int OthersCount => _others.Count;
private void SetResults()
{
Сollating();
var consonats = _letters.Except(_vowels);
ConsonantsCount = consonats.Count();
}
private void Сollating()
{
for (int i = 0; i < _chars.Length; i++)
{
var currChar = _chars[i];
if (Char.IsLetter(currChar))
{
_letters.Add(currChar);
}
else if (Char.IsDigit(currChar))
{
_digits.Add(currChar);
}
else if (Char.IsWhiteSpace(currChar))
{
//пробелы не учитываем
}
else
{
_others.Add(currChar);
}
}
}
internal string GetTotalResult()
{
var sb = new StringBuilder();
sb.AppendLine($"Гласных: {VowelsCount}");
sb.AppendLine($"Согласных: {ConsonantsCount}");
sb.AppendLine($"Цифр: {DigitsCount}");
sb.AppendLine($"Другие: {OthersCount}");
return sb.ToString();
}
}
Тогда код формы такой
public partial class FormMain : Form
{
public FormMain()
{
InitializeComponent();
_buttonRun.Click += ButtonRun_Click;
}
private void ButtonRun_Click(object sender, EventArgs e)
{
if (TryGetInputArray(_textBoxInput.Text, out char[] inputArray))
{
var ta = new TextAnalyzer(inputArray);
_textBoxOutput.Text = ta.GetTotalResult();
}
}
private bool TryGetInputArray(string text, out char[] inputArray)
{
var result = false;
inputArray = null;
var inputText = text.Trim();
if (String.IsNullOrEmpty(inputText))
{
MessageBox.Show("Введите текст для анализа.", "Информация",
MessageBoxButtons.OK, MessageBoxIcon.Information);
}
else
{
result = true;
inputArray = inputText.ToCharArray();
}
return result;
}
}