Я написал программу для подсчета слов в предложении, которые имеют x количество совпадающих символов. Входная строка является многострочной строкой, и мне нужно рассматривать только альтернативные строки на основе заданных критериев. Также в этих отфильтрованных строках мне нужно дополнительно выбрать альтернативные слова и затем проверить, соответствуют ли эти отфильтрованные слова символам для пересечения.
например. скажем, у меня есть строка ввода, как показано ниже, и мне нужно найти слова с 2 или более гласными в них:
string myString = "1.In order to get a Disneyland ticket
2.that includes the new Star Wars land
3.you must stay at a Disney hotel
4.the night of or night before your visit.
5.Day passes without a hotel
6.reservation will be available after June 23";
теперь давайте предположим, что мне нужно считать каждое 3-е слово в каждой 2-й строке и считать, если в этих отфильтрованных словах есть 2 или более гласных. Если это условие соответствует, вернуть соответствующее количество слов и общее количество строк, содержащих эти
соответствующие слова.
например. с критериями выбора каждой 2-й строки, отфильтрованные строки будут {2, 4, 6}. Аналогично, каждое 3-е слово в этой отфильтрованной строке будет строкой 2: {"the", "Wars"}, для строки 4: {"of", "before"} и для строки 6: {"be", "after"} ,
Для этих отфильтрованных слов совпадающие слова с 2 или более гласными будут {"до"} в строке номер 4 и слова {"после"} в строке 6. Таким образом, конечный результат будет wordCount = 2, и так как эти слова из строки 4 и 6, так что общее количество lineCount = 2.
Я написал приведенный ниже код, используя вложенные циклы for, которые выдают желаемый результат.
public static void Main(string[] args)
{
int vowelCount = 2; // match words with 2 or more vowels
int skipWord = 3; // Consider every 3rd word only
int skipLine = 2; // Consider every 2nd line only
int wordCount = 0;
int lineCount = 0;
string myString = @"1.In order to get a Disneyland ticket
2.that includes the new Star Wars land
3.you must stay at a Disney hotel
4.the night of or night before your visit.
5.Day passes without a hotel
6.reservation will be available after June 23";";
List<string> myList = myString.Split(Environment.NewLine).ToList();
List<string> lineWords = new List<string>();
char[] vowels = {'a', 'e', 'i', 'o', 'u'};
for (int i = skipLine; i <= myList.Count; i += skipLine)
{
int origWordCount = wordCount;
lineWords = myList[i - 1].Split(' ').ToList();
for (int j = skipWord; j <= lineWords.Count; j += skipWord)
{
char[] wordArr = lineWords[j-1].ToLower().ToCharArray();
int match = vowels.Intersect(wordArr).Count();
if (match >= vowelCount)
wordCount++;
}
if (wordCount > origWordCount)
lineCount++;
}
Console.WriteLine("WordCount : {0}, LineCount : {1}", wordCount, lineCount);
Вышеупомянутый код прекрасно работает, но интересно, есть ли способ сделать это без вложенных циклов. Я читал о выражениях linq и lambda, но не уверен, как их использовать здесь.
Все комментарии приветствуются.