Выбор слов с гласными в списке

#c# #pattern-matching

#c# #сопоставление с шаблоном

Вопрос:

Я использую класс StreamReader для чтения из текстового файла и загрузки его в список, теперь я хочу выбрать слова с гласными и сохранить их в новом списке, чтобы я мог использовать StreamWriter для записи только выбранных слов в новый текстовый файл

Комментарии:

1. Это может быть любое слово с гласными или без них, важно то, что здесь мне нужно только слово, содержащее только гласные. Например, программирование, загрузка, выбор и т. Д

2. @Michael27 «Программирование» содержит не только гласные

3. Вам действительно нужно поработать над вашим вопросом. only vowels , words , list вам нужно прояснить многие из них.

4. @Oscar извини, что я виноват. Я имел в виду выбрать из списка слов слово, которое содержит только гласную, это более понятно

5. Я думаю, он имеет в виду, что у него есть коллекция строк, и он хочет выбрать только те строки, которые содержат хотя бы одну гласную (хотя не могу представить слишком много естественных языков, в которых есть слова без гласных), но я мог неправильно читать.

Ответ №1:

Чтобы выбрать слова из заданного списка слов (который вы, однако, извлекаете), вы можете выбрать те, которые только содержат гласные, используя Linq:

 string vowels = "aeiou";
List<string> words = new List<string>();
//words populated
var vowelWords = words.Where( word => word.All( c => vowels.Contains(c) ))
                      .ToList();
  

Если вам просто нужны слова, которые содержат хотя бы гласную (это не совсем понятно из вопроса):

 var vowelWords = words.Where( word => word.Any( c => vowels.Contains(c) ))
                      .ToList();
  

Редактировать в ответ на комментарий:

Чтобы выбрать слова, содержащие более одной гласной:

 var vowelWords = words.Where(word => word.Count(c => vowels.Contains(c)) > 1)
                      .ToList();
  

Комментарии:

1. «Если вам просто нужны слова, содержащие хотя бы гласную» У меня вопрос по этому поводу, возможно ли выбрать слова, содержащие более 1 гласной?

2. спасибо, var vowelWords = слова. Где(word => слово. Подсчитайте (c => гласные. Содержит(c)) > 1) .ToList(); это сработало

Ответ №2:

Вот пример, который будет работать. Я написал это в Notepad , так что некоторые ; или похожие могут отсутствовать. Вы можете адаптировать его к своим потребностям:

 //Reading...
List<string> originalWords = new List<string>();

using (var reader = new StreamReader(...)) {
    while (!reader.EndOfLine()) {
        string line = reader.ReadLine();
        var splitted = line.Split(new string[] {" "}, StringSplitOptions.None);
        foreach (var word in splitted) {
            if (!originalWords.Contains(word)) {
                originalWords.Add(word);
            }
        }
    }
}

//Filtering...
List<string> filtered = new List<string>();
string vowels = "aeiou";

foreach (var word in originalWords) {
    foreach (var vowel in vowels) {
        if (word.Contains(vowel))
            filtered.Add(vowel);
            break;
    }
}

//Writing...
using (var writer = new StreamWriter(...)) {
    foreach (var word in filtered) {
        writer.WriteLine(word);
    }
}
  

Ответ №3:

Вы можете сделать это довольно быстро с помощью Linq и регулярных выражений

 var words = [your code to get them into a collection]

var withVowels = from word in words
                 where Regex.IsMatch(word, "[AEIOUaeiou]")
                 select word;
  

Ответ №4:

Вы также можете сопоставить какое-нибудь регулярное выражение, поскольку, возможно, захотите считать, что y — это гласная. Начните с ([aeiou])|([A-Za-z]y) , затем двигайтесь дальше, если вам нужно что-то более сложное. http://www.nregex.com/nregex/default.aspx это хорошее место для начала, если вы хотите протестировать свое регулярное выражение.

 // Your words go in here
List<string> words;
// is vowelled a word?
var vowelledWords = words.Where(w => Regex.IsMatch(w, "([aeiou])|([A-Za-z]y)"));