我想从字符串数组中删除元音我是用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);
}
Run Code Online (Sandbox Code Playgroud)
但我没有得到预期的结果.
我得到以上查询的输出是: -
cllo
cell
guitr
gutar
gitar
voln
vilin
Run Code Online (Sandbox Code Playgroud)
期望的输出:
cll
gtr
vln
Run Code Online (Sandbox Code Playgroud)
Yaa*_*lis 13
您可以使用正则表达式匹配所有元音并使用空字符串替换它们,从而非常有效地完成此操作:
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);
}
Run Code Online (Sandbox Code Playgroud)
这将返回您要查找的输出.
您的原始尝试无法正常工作,因为它会针对其包含的每个唯一元音单独评估每个单词.
更新:我对此解决方案与基于Mathias的HashSet<char>解决方案(此处为基准代码)进行了一些基本的基准测试,包括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%
Run Code Online (Sandbox Code Playgroud)
事实证明,如果你只初始化HashSet和模式string一次,那么它们的性能非常相似.Regex击败Hashset,但只是勉强(超过250亿字快80毫秒)和正则表达式编译和非编译执行几乎完全相同.但是,如果每次运行它都初始化HashSet,那么它会杀死HashSet方法的性能.
需要注意的是,如果您想使用该HashSet方法,请确保HashSet每个字符集仅初始化一次您要排除的字符.
尽管Yaakov的reg-ex解决方案在优雅和效率方面要好得多,但您可以Where为了学习而使用:
string[] strArray = new string[] { "cello", "guitar", "violin" };
var vowels = new HashSet<char>("aeiou"); // or: { 'a', 'e', 'i', 'o', 'u' };
var vNovowels2 = from vitem in strArray
select new string(vitem.Where(c => !vowels.Contains(c)).ToArray());
foreach (var item in vNovowels2)
{
Console.WriteLine(item);
}
Run Code Online (Sandbox Code Playgroud)