C# 替换通用列表中的所有元音

C# Replace All Vowels in Generic List

如何用 space 替换列表中的所有元音?以下代码似乎不起作用。

        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

如果需要更改集合中的值,您应该使用 .Select:

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);
        }

试试这个

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())));

有点快和脏,但这对我有用。

  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));

Instruments 中有 string 或单词的集合。您的 .ForEach 遍历该集合,其中每个实例都是 w,但是您在这里使用 .Replace 不会影响这些实例,您是在操作中使用它们来影响字符串 vowels.

请参阅 String.Replace MSN 文档。

因此,您还需要遍历 vowels string,并使用 vowelschar 实例:w.Replace(v, " "),其中 wInstruments 中的单词实例, vvowels 中的元音实例:

所以,应该是Instruments.ForEach(w => foreach (vowelChar in vowels.split(" ")) { w.Replace(vowelChar, " "); });

注意:@mjwills 在评论中指出了此操作的另一个问题。对 w 的分配不会在这里持续存在。所以,你需要以某种方式创建新的 List<string> 来持久化它(要么事先声明它并在迭代中添加它,要么使用 Linq .ToList<T> IEnumerable<T> 的扩展。


但是,这是低效的,因为您实际上是在 Instruments 的每次迭代中使用 .Splitvowels string 创建一个 char[]。 =44=]

相反,您应该将 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, ' ');
        }
    });

编辑:在迭代中分配给 Instrumentsw 个实例不会持续存在,因此您需要为结果创建一个 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));

您可以尝试使用 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);
    }
}

这很适合我:

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