【问题标题】:Is it good practice to use lambda expressions instead of foreach? [closed]使用 lambda 表达式而不是 foreach 是一种好习惯吗? [关闭]
【发布时间】: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 的简洁性,但是断点呢?

标签: c# linq foreach lambda


【解决方案1】:

lambda 表达式看起来比 foreach 更简洁,但哪个更好?

“看起来更干净”是更好做法的完美指标。根据所使用的语言工具,性能以有意义的方式改变是极其罕见的,因此可读性是衡量特定结构对您的代码有多好的最重要衡量标准。可读性最终决定了代码的可维护性,即使代码的唯一读者是您。

请注意,这是一个个案决定,因为 lambda 在一种情况下可能更好,而循环在另一种情况下可能更好。

【讨论】:

    【解决方案2】:

    是的,在这种情况下使用 LINQ 是一种很好的做法,因为它更具可读性。但是,对我来说,installedVoices.Any 而不是 installedVoices.FirstOrDefault 会更具可读性。

    【讨论】:

    • 另外,.Any 在逻辑上等同于他的 foreach。
    • installedVoice.Any 会返回满足条件的多个声音吗?
    • @CatalinHoha 它将返回 true。
    • 哦,是的!现在我看到它返回一个布尔值。在那种情况下,我会使用 .Any,因为它更适合我的需要。
    猜你喜欢
    • 2013-03-30
    • 2015-02-18
    • 2016-03-20
    • 1970-01-01
    • 2017-04-28
    • 2020-08-25
    • 2021-05-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多