2016-07-26 17 views
6

Heute habe ich an einer TextToSpeech App gearbeitet und ich bin auf eine Situation gestoßen, in der ich prüfen muss, ob die ausgewählte Stimme des Benutzers auf dem Computer installiert ist.Ist es empfehlenswert, Lambda-Ausdrücke anstelle von foreach zu verwenden?

Dafür konnte ich entweder einen foreach:

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

Oder eine lamda Ausdruck:

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

Die installedVoices ist ein Readonlycollection < InstalledVoice> von Speechsynthesizer.

Definitiv sieht der Lambda-Ausdruck sauberer aus als der foreach, aber welcher ist besser?

Von was ich getestet habe scheint die foreach leicht schneller als der Lambda-Ausdruck zu sein.

Außerdem können sowohl foreach als auch lambda in der Zukunft erweitert werden, wenn sofortige Maßnahmen auf InstalledVoice erforderlich sind.

+0

Der einzige Weg, ich kann sagen, dass das erste Snippet nach dem ersten Vorkommen von etwas sucht, ist, indem Sie das * zweite * Snippet sehen. Was sollte die Frage beantworten. –

+8

Es ist eine Frage der Präferenz. Und Code-Konsistenz. Und Teamkonsens. Es gibt eine Reihe von Parametern, die entscheiden, was "besser" ist. Lesbarkeit? Performance? – Default

+1

Wenn Sie eine bool wollen, könnten Sie tun: 'var foundVoice = installedVoices.Any (v => v.VoiceInfo.Name.Contains (selectedVoice) && v.VoiceInfo.Culture.ToString() == selectedCulture);' Dies würde sei das wahre Äquivalent zu deiner Foreach. – Mafii

Antwort

7

der Lambda-Ausdruck sieht sauberer aus als der foreach, aber welcher ist besser?

"Sieht sauberer" ist ein perfekter Indikator für eine bessere Praxis. Es ist äußerst selten, dass sich die Leistung in Abhängigkeit von der verwendeten Sprachfunktion in einer sinnvollen Weise ändert. Daher ist die Lesbarkeit das wichtigste Maß dafür, wie gut ein bestimmtes Konstrukt für Ihren Code ist. Lesbarkeit entscheidet letztendlich über die Wartbarkeit Ihres Codes, auch wenn Sie nur der Leser Ihres Codes sind.

Beachten Sie, dass dies eine fallweise Entscheidung ist, da Lambdas in einer Situation besser sein können und Schleifen in einer anderen Situation besser sein könnten.

4

Ja, es ist gute Praxis, LINQ in diesem Fall zu verwenden, weil es besser lesbar ist. Allerdings wäre für mich installedVoices.Any statt installedVoices.FirstOrDefault noch besser lesbar.

+2

Auch ".Any" ist das logische Äquivalent zu seiner Foreach. – Mafii

+0

Was wird installedVoice.Any zurückgegeben, wenn mehr als eine Stimme die Bedingung erfüllt? –

+0

@CatalinHoha Es wird wahr zurückkommen. –