C # заменить все гласные в общем списке - PullRequest
0 голосов
/ 11 февраля 2019

Как заменить все гласные в списке пробелом?Следующий код не работает.

        List<string> Instruments = new List<string>();

        Instruments.Add("cello");
        Instruments.Add("guitar");
        Instruments.Add("violin");
        Instruments.Add("double bass");

        string vowels = "a e i o u y";


        Instruments.ForEach(w=>vowels = vowels.Replace(w,""));

Ожидаемый результат:

cll
gtr
vln

Ответы [ 6 ]

0 голосов
/ 14 февраля 2019

Это хорошо работает для меня:

List<string> Instruments = new List<string>();

Instruments.Add("cello");
Instruments.Add("guitar");
Instruments.Add("violin");
Instruments.Add("double bass");

string vowels = "aeiouy";

var results = vowels.Aggregate(Instruments,
    (i, v) => i.Select(x => x.Replace(v.ToString(), "")).ToList());

Я получаю:

cll 
gtr 
vln 
dbl bss 
0 голосов
/ 11 февраля 2019

Вы можете попробовать то же самое с Regex:

public void ReplaceAllVowels()
{
    List<string> Instruments = new List<string>();

    Instruments.Add("cello");
    Instruments.Add("guitar");
    Instruments.Add("violin");
    Instruments.Add("double bass");

    var pattern = new Regex("[aeiouy]");
    var lst = Instruments.Select(i => pattern.Replace(i, "")).ToList();
    foreach (var item in lst)
    {
        Console.WriteLine(item);
    }
}
0 голосов
/ 11 февраля 2019

Instruments содержит коллекцию string или слов.Ваш .ForEach выполняет итерацию по этой коллекции, где каждый экземпляр равен w, но вы не влияете на эти экземпляры, используя здесь .Replace, вы используете их в операции для воздействия на строку vowels.

см. String.Replace Документация MSN.

Таким образом, вам также необходимо выполнить итерацию по vowels string и использовать char экземпляр vowels: w.Replace(v, " "), где w - это ваш экземпляр слова в Instruments, а v - ваш экземпляр гласного в vowels:

Итак, это должно быть Instruments.ForEach(w => foreach (vowelChar in vowels.split(" ")) { w.Replace(vowelChar, " "); });

Примечание: @mjwills указал на другую проблему с этой операцией в комментариях.присвоение w не будет сохраняться здесь.поэтому вам нужно каким-то образом создать новый List<string>, чтобы сохранить его (либо объявить его заранее и добавить к нему в итерации, либо использовать Linq .ToList<T> расширение IEnumerable<T>.


Однако это неэффективно, поскольку вы по сути создаете char[] из vowels string, используя .Split на каждой итерации Instruments.

Вместо этого вы должны определить свой vowels как char[], чтобы избежать необходимости этой операции: var vowels = new char[] {'a','e','i','o','u', 'y'};

    List<string> Instruments = new List<string>();

    Instruments.Add("cello");
    Instruments.Add("guitar");
    Instruments.Add("violin");
    Instruments.Add("double bass");

    char[] vowels = new char[] {'a','e','i','o','u','y'};

    Instruments.ForEach(w => {
        foreach (char v in vowels) {
           w = w.Replace(v, ' ');
        }
    });

РЕДАКТИРОВАТЬ: назначение w экземпляров Instruments в итерации не сохраняется, поэтомувам нужно создать новый экземпляр List<string> для ваших результатов.

    List<string> results = new List<string>();
    Instruments.ForEach(w => {
        foreach (char v in vowels) {
           results.Add(w.Replace(v, ' '));
        }
    });

    results.ForEach(w => Console.WriteLine(w));

0 голосов
/ 11 февраля 2019

Немного быстро и грязно, но это работает для меня.

  List<string> Instruments = new List<string>();
  var newList = new List<String>();

  Instruments.Add("cello");
  Instruments.Add("guitar");
  Instruments.Add("violin");
  Instruments.Add("double bass");

  List<string> vowels = new List<string> { "a", "e", "i", "o", "u", "y" };

  Instruments.ForEach(w =>
  {
    var temp = w;
    vowels.ForEach(v =>
    {
      temp = temp.Replace(v, "");
    });
    newList.Add(temp);
  });

  newList.ForEach(w => Console.WriteLine(w));
0 голосов
/ 11 февраля 2019

Попробуйте это

var vowels = new List<char> {'a','e','i','o','u','y'};

var result = new List<string>();
Instruments.ForEach(w => result.Add(new string(w.Select(x => vowels.Any(y => y == x) ? ' ' : x).ToArray())));
0 голосов
/ 11 февраля 2019

Вы должны использовать. Выберите, если необходимо изменить значения в коллекции:

List<string> Instruments = new List<string>();

        Instruments.Add("cello");
        Instruments.Add("guitar");
        Instruments.Add("violin");
        Instruments.Add("double bass");

        var regex = new Regex("^a|e|i|o|u", RegexOptions.IgnoreCase);

        var withoutVowels = from instr in Instruments
            select regex.Replace(instr, string.Empty);

        foreach (var item in withoutVowels)
        {
            Console.WriteLine(item);
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...