2016-07-26 39 views
6

今天我正在研究一個TextToSpeech應用程序,並且遇到了一種情況,我需要檢查用戶選擇的語音是否安裝在計算機上。使用lambda表達式而不是foreach是不是很好?

對於這一點,我既可以使用一個的foreach

bool foundVoice = false; 
foreach (var v in installedVoices) 
{ 
    if (v.VoiceInfo.Name.Contains(selectedVoice) && v.VoiceInfo.Culture.ToString() == selectedCulture) 
    { 
     foundVoice = true; 
     break; 
    } 
} 

或者一個的λ表達

var foundVoice = installedVoices.FirstOrDefault(v => v.VoiceInfo.Name.Contains(selectedVoice) && v.VoiceInfo.Culture.ToString() == selectedCulture); 

的installedVoices是ReadOnlyCollection < InstalledVoice>SpeechSynthesizer

當然,lambda表達式看起來比foreach更清晰,但哪一個更好?

從我測試過的foreach似乎是稍微比lambda表達式更快

此外,如果需要立即對InstalledVoice執行操作,foreach和lambda可以在將來擴展。

+0

我可以告訴第一個片段搜索某個東西的第一個事件的唯一方法是通過查看* second *片段。應該回答這個問題。 –

+8

這是一個偏好問題。和代碼一致性。和團隊共識。有一堆參數決定哪個更好。可讀性?性能? – Default

+1

如果你想要一個布爾,你可以這樣做:'var foundVoice = installedVoices.Any(v => v.VoiceInfo.Name.Contains(selectedVoice)&& v.VoiceInfo.Culture.ToString()== selectedCulture);'This would與你的foreach真正相當。 – Mafii

回答

7

lambda表達式看起來比foreach更乾淨但哪一個更好?

「看起來更乾淨」是更好實踐的完美指標。根據所使用的語言設施,以有意義的方式更改性能極爲罕見,因此可讀性是衡量特定構造對您的代碼有多好的最重要指標。可讀性最終決定了代碼的可維護性,即使您的代碼的唯一讀者是您。

請注意,這是一個逐案的決定,因爲在一種情況下,lambda可能會更好,在另一種情況下,循環會更好。

4

是的,在這種情況下使用LINQ是個好習慣,因爲它更具可讀性。不過,對我來說installedVoices.Any而不是installedVoices.FirstOrDefault會更具可讀性。

+2

另外,'.Any'與他的foreach是等價的。 – Mafii

+0

什麼將installedVoice.Any返回如果有多個語音滿足條件? –

+0

@CatalinHoha它將返回true。 –

相關問題