gpt4 book ai didi

c# - 使用 LINQ 从字符串中删除元音

转载 作者:太空狗 更新时间:2023-10-29 17:33:12 24 4
gpt4 key购买 nike

我想从字符串数组中删除元音我用 foreach 循环做到了但是现在想使用 LINQ 或 Lambda 表达式执行它

我已经尝试了以下代码 LINQ

string[] strArray = new string[] { "cello", "guitar", "violin"};
string[] vowels = new string[] { "a", "e", "i", "o", "u" };

var vNovowels = from vitem in strArray
from vowel in vowels
where vitem.Contains(vowel)
select vitem.Replace(vowel, "");

foreach (var item in vNovowels)
{
Console.WriteLine(item);
}

但我没有得到预期的结果。

我通过上述查询得到的输出是:-

cllo
cell
guitr
gutar
gitar
voln
vilin

期望的输出:

cll
gtr
vln

最佳答案

您可以使用正则表达式匹配所有元音并用空字符串替换它们来非常有效地完成此操作:

var strArray = new List<string> { "cello", "guitar", "violin" };
var pattern = @"[aeiou]";
var noVowels = strArray.Select(item =>
Regex.Replace(item, pattern, "", RegexOptions.IgnoreCase));
foreach (var item in noVowels) {
Console.WriteLine(item);
}

这将返回您要查找的输出。

您最初的尝试没有成功,因为它针对它包含的每个唯一元音单独评估每个单词。

更新:我对这个解决方案与 Mathias' HashSet<char> based solution 做了一些基本的基准测试( benchmark code here ),包括 Regex 版本的编译和非编译版本。我针对 2582 个 lorem-ipsum 单词的数组运行它,针对该集合迭代 1000 万次(因此大约 250 亿个单词),在 LinqPad 中运行它,取 3 次运行的平均值:

                  Init Each Time              Init One Time
avg ms % diff avg ms % diff
Regex 586 +1% 586 -
Regex Compiled 581 - 593 +1%
HashSet 2550 +339% 641 +10%

事实证明,如果你只初始化 HashSet和图案string一次,然后他们有非常相似的表现。 Regex击败Hashset ,但仅勉强(超过 250 亿个单词快 80 毫秒)并且 Regex Compiled 和 Noncompiled 的表现几乎相同。但是,如果每次运行时都初始化 HashSet,那么它会降低 HashSet 方法的性能。

要点是,如果您想使用 HashSet方法,一定要初始化你的 HashSet每组要排除的字符仅一次。

关于c# - 使用 LINQ 从字符串中删除元音,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21902845/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com