#c# #string #char
#c# #строка #символ
Вопрос:
Я хочу найти количество букв «a» только в первом предложении. Приведенный ниже код находит «a» во всех предложениях, но я хочу только в первом предложении.
static void Main(string[] args)
{
string text; int k = 0;
text = "bla bla bla. something second. maybe last sentence.";
foreach (char a in text)
{
char b = 'a';
if (b == a)
{
k = 1;
}
}
Console.WriteLine("number of a in first sentence is " k);
Console.ReadKey();
}
Комментарии:
1. Пожалуйста, просмотрите свой код, пока не сможете задать более конкретный вопрос.
2. Сначала вы должны определить первое предложение. Изолируйте это. Тогда найти первую букву «a» тривиально. К сожалению, точная идентификация предложения действительно может быть нетривиальной.
3. Как вы определяете предложение? Точка может встречаться в самых разных местах… например, 1.5 или «Она сказала: «Вау».
Ответ №1:
Это разделит строку на массив, разделенный символом ‘.’, затем подсчитывает количество символов ‘a’ в первом элементе массива (первое предложение).
var count = Text.Split(new[] { '.', '!', '?', })[0].Count(c => c == 'a');
В этом примере предполагается, что предложение разделено символом ., ? или !. Если в вашей строке есть десятичное число (например, 123.456), это будет считаться разрывом предложения. Разбиение строки на точные предложения — довольно сложное упражнение.
Комментарии:
1. Я бы включил ‘!’ и ‘?’ в качестве аргументов разделения, но в остальном это самый элегантный способ сделать это.
2. Хороший ответ, укажите случай, когда введенный текст не содержит «.», для моего одобрения.
3. Хороший ответ, короче и проще, чем мой. 1 для вас !! 🙂
4. Вызываем String. Разбиение на пустую строку вернет массив с пустой строкой с индексом 0. Вызывающая строка. Разбиение на строку, которая не соответствует ни одному из разделяемых символов, вернет всю строку с индексом 0 в массиве. Только что протестировано с использованием «abc» и «» в виде текста.
5. да, это была одна часть домашней работы. я буду помечать подобные вопросы как домашнее задание в другой раз :). Я новичок в этом, и в программировании тоже.
Ответ №2:
Это, возможно, более подробное, чем то, что вы искали, но, надеюсь, это приведет к пониманию по мере прочтения.
public static void Main()
{
//Make an array of the possible sentence enders. Doing this pattern lets us easily update
// the code later if it becomes necessary, or allows us easily to move this to an input
// parameter
string[] SentenceEnders = new string[] {"$", @".", @"?", @"!" /* Add Any Others */};
string WhatToFind = "a"; //What are we looking for? Regular Expressions Will Work Too!!!
string SentenceToCheck = "This, but not to exclude any others, is a sample."; //First example
string MultipleSentencesToCheck = @"
Is this a sentence
that breaks up
among multiple lines?
Yes!
It also has
more than one
sentence.
"; //Second Example
//This will split the input on all the enders put together(by way of joining them in [] inside a regular
// expression.
string[] SplitSentences = Regex.Split(SentenceToCheck, "[" String.Join("", SentenceEnders) "]", RegexOptions.IgnoreCase);
//SplitSentences is an array, with sentences on each index. The first index is the first sentence
string FirstSentence = SplitSentences[0];
//Now, split that single sentence on our matching pattern for what we should be counting
string[] SubSplitSentence = Regex.Split(FirstSentence, WhatToFind, RegexOptions.IgnoreCase);
//Now that it's split, it's split a number of times that matches how many matches we found, plus one
// (The "Left over" is the 1
int HowMany = SubSplitSentence.Length - 1;
System.Console.WriteLine(string.Format("We found, in the first sentence, {0} '{1}'.", HowMany, WhatToFind));
//Do all this again for the second example. Note that ideally, this would be in a separate function
// and you wouldn't be writing code twice, but I wanted you to see it without all the comments so you can
// compare and contrast
SplitSentences = Regex.Split(MultipleSentencesToCheck, "[" String.Join("", SentenceEnders) "]", RegexOptions.IgnoreCase | RegexOptions.Singleline);
SubSplitSentence = Regex.Split(SplitSentences[0], WhatToFind, RegexOptions.IgnoreCase | RegexOptions.Singleline);
HowMany = SubSplitSentence.Length - 1;
System.Console.WriteLine(string.Format("We found, in the second sentence, {0} '{1}'.", HowMany, WhatToFind));
}
Вот результат:
We found, in the first sentence, 3 'a'.
We found, in the second sentence, 4 'a'.
Комментарии:
1. Очень надеюсь, что ваш производственный код написан не так. Вы зря тратите место на жестком диске на все это. 🙂
2. Пустая трата места на жестком диске? Из-за нескольких дополнительных символов? Вы должны посмотреть концепцию читаемого кода по сравнению с более коротким кодом — большинство согласны с тем, что читаемый / поддерживаемый намного лучше.
3. Я саркастично отозвался о пространстве на жестком диске. Однако — существует тонкая грань между нечитаемым кодом, читаемым кодом и слишком большим количеством кода. Помните — чем больше кода вы пишете для решения одной и той же проблемы, тем больше вероятность ошибок. Решение на основе LINQ, приведенное выше (одна строка), очень читабельно, а также коротко и привлекательно. Единственным недостатком решения со ссылкой было бы, если бы вам пришлось отлаживать его и проверять циклы — но в данном случае это кажется излишеством.
4. Извините — я полностью пропустил сарказм. =) И хотя «потенциальных строк» для ошибок больше, я также нахожу, что в целом ошибок меньше, потому что работа более интуитивно понятна и за ней легко следить. Тем не менее, у меня также нет проблем с примерами LINQ, но люди, новички в программировании, возможно, не смогут по-настоящему понять, что происходит, без такого рода прорыва.
Ответ №3:
Вы не определили «предложение», но если мы предположим, что оно всегда заканчивается точкой ( .
), просто добавьте это внутри цикла:
if (a == '.') {
break;
}
Расширьте это, чтобы поддерживать другие разделители предложений.
Комментарии:
1. Да, вам действительно нужно определить предложение. Остерегайтесь предложений типа «Однажды мистер Барнс пошел в магазин».
2. я так много думал об этом и знал, что это очень просто. спасибо, чувак, это работает.
Ответ №4:
Просто «разорвите» foreach(...)
цикл, когда встретите «.» (точка)
Ответ №5:
Ну, предположим, вы определяете предложение как заканчивающееся на ‘.»
Используйте String.indexOf() для определения позиции первого ‘.’. После этого выполните поиск в подстроке, а не во всей строке.
Ответ №6:
- найдите место ‘.’ в тексте ( вы можете использовать разделение)
- подсчитайте ‘a’ в тексте от места 0 до экземпляра ‘.’
Ответ №7:
string SentenceToCheck = "Hi, I can wonder this situation where I can do best";
//Here I am giving several way to find this
//Using Regular Experession
int HowMany = Regex.Split(SentenceToCheck, "a", RegexOptions.IgnoreCase).Length - 1;
int i = Regex.Matches(SentenceToCheck, "a").Count;
// Simple way
int Count = SentenceToCheck.Length - SentenceToCheck.Replace("a", "").Length;
//Linq
var _lamdaCount = SentenceToCheck.ToCharArray().Where(t => t.ToString() != string.Empty)
.Select(t => t.ToString().ToUpper().Equals("A")).Count();
var _linqAIEnumareable = from _char in SentenceToCheck.ToCharArray()
where !String.IsNullOrEmpty(_char.ToString())
amp;amp; _char.ToString().ToUpper().Equals("A")
select _char;
int a =linqAIEnumareable.Count;
var _linqCount = from g in SentenceToCheck.ToCharArray()
where g.ToString().Equals("a")
select g;
int a = _linqCount.Count();