【发布时间】:2016-11-30 00:12:59
【问题描述】:
今天我正在开发一个 TextToSpeech 应用程序,我遇到了一种情况,我需要检查用户选择的语音是否安装在计算机上。
为此,我可以使用 foreach:
bool foundVoice = false;
foreach (var v in installedVoices)
{
if (v.VoiceInfo.Name.Contains(selectedVoice) && v.VoiceInfo.Culture.ToString() == selectedCulture)
{
foundVoice = true;
break;
}
}
或者一个lamda表达式:
var foundVoice = installedVoices.FirstOrDefault(v => v.VoiceInfo.Name.Contains(selectedVoice) && v.VoiceInfo.Culture.ToString() == selectedCulture);
installedVoices 是来自 SpeechSynthesizer 的 ReadOnlyCollection
毫无疑问,lambda 表达式看起来比 foreach 更简洁,但哪个更好?
从我测试的结果来看,foreach 似乎比 lambda 表达式略快。
此外,如果需要对 InstalledVoice 立即采取行动,将来可以扩展 foreach 和 lambda。
【问题讨论】:
-
我知道第一个 sn-p 搜索第一次出现的唯一方法是查看 second sn-p。哪个应该回答这个问题。
-
这是一个偏好问题。和代码一致性。和团队共识。有一堆参数决定哪个“更好”。可读性?性能?
-
如果你想要一个布尔值,你可以这样做:
var foundVoice = installedVoices.Any(v => v.VoiceInfo.Name.Contains(selectedVoice) && v.VoiceInfo.Culture.ToString() == selectedCulture);这将是你的 foreach 的真正等价物。 -
我同意之前的评论。您(和您的团队)越熟悉 Linq 和 Linq 式思维,您就越喜欢 lambda 风格。但是,“老派”人习惯于在 foreach 模式中进行思考,并且会认出这些模式。顺便说一句,两个 sn-ps 是不等价的:第一个返回 true/false,而第二个返回语音或 null。为了公平比较,他们应该做完全相同的事情。
-
我喜欢 lambda 的简洁性,但是断点呢?