1) Без использования регулярных выражений делает C# предлагают любую конструкцию для соответствием шаблона?
Ничего такого мощного, как регулярное выражение, которое дает вам все за один выстрел.
2) Для подсчета индивидуального характера против строки мне нужно сделать, чтобы получить мой собственный метод?
Я не рекомендую этот подход, но я о том, что просто, чтобы показать, что вы могли бы использовать некоторые встроенные в методе ее достижения. Вы могли бы использовать String.IndexOf и искать «а», начиная с индекса 0, и продолжать движение в цикле, увеличивая счетчик на положительных совпадениях. Затем повторите для «e» ... «u», но он будет намного менее эффективным, чем регулярное выражение или цикл for.
Лучшим подходом было бы просто перебрать строковый символ символом char и либо передать его в существующий оператор switch, либо просмотреть его в некоторой коллекции.
Поскольку вы хотите использовать LINQ, вот как можно было переписать идею выше для цикла, чтобы она соответствовала. Заметьте, эта идея похожа на HuBeZa's solution так что +1 там. Тем не менее, я использую список для искать и использовать StringComparison.InvariantCultureIgnoreCase
перечисление игнорировать случай:
var vowels = new List<string> { "a", "e", "i", "o", "u" };
var query = words.Select(s => new
{
Text = s,
Count = s.Count(c => vowels.Exists(vowel =>
vowel.Equals(c.ToString(),
StringComparison.InvariantCultureIgnoreCase)))
});
foreach (var item in query)
{
Console.WriteLine("String {0} contains {1} vowels", item.Text, item.Count);
}
Мой первоначальный ответ регулярное выражение ниже.
Regex подход
Там же лучше регулярное выражение решение, чем тот, который вы используете. Я не уверен, знаете ли вы об этом, и я почувствовал, что это заслуживает публикации. В вопросе № 1 вы сказали «без использования регулярных выражений», но IMHO, который напрямую конфликтует с вопросом №2, где вы спросили, нужно ли вам получить свой собственный метод.
Вы можете сократить свой код, используя Regex.Matches method и Count property на возвращенном MatchCollection:
Regex rx = new Regex("[aeiou]");
// to ignore case use: new Regex("[aeiou]", RegexOptions.IgnoreCase);
string[] words =
{
"aesthetic", "benevolent", "abstract",
"capricious", "complacent", "conciliatory",
"devious", "diligent", "discernible","dogmatic",
"eccentric","fallacious","indifferent","inquisitive",
"meticulous","pertinent","plausible", "reticent"
};
foreach (string input in words)
{
Console.WriteLine("String {0} contains {1} vowels",
input, rx.Matches(input).Count);
}
// if you really want to use LINQ
var query = from s in words
select new
{
Text = s,
Count = rx.Matches(s).Count
};
foreach (var item in query)
{
Console.WriteLine("String {0} contains {1} vowels", item.Text, item.Count);
}
Кстати, вы можете дополнительно сократить исходный код, изменив 2 пунктов:
1) Строка массив объявлений (я сделал это в моем примере выше)
2) Сделайте заявления о своих делах попадающими на следующую метку корпуса:
switch (c)
{
case 'a':
case 'e':
case 'i':
case 'o':
case 'u':
cnt++;
break;
}
EDIT: обновлен с запросом LINQ. Это не сильно отличается от того, что имел OP, просто используя подход «Матчи».
Надеюсь, вы получили свой ответ. Добавьте к этому тегу 'regex'. – HuBeZa