In letzter Zeit stelle ich mir immer wieder die Frage, ob man bestimmte Funktionen nicht effizienter schreiben kann, hinsichtlich Laufzeit und Speicherverbrauch.
Zur Zeit sitze ich an einer einfachen Funktion, die das Minimum von vier Zahlen ausgeben soll. Es dürfen nicht mehr und nicht weniger Zahlen sein, sondern nur vier. Aktuell sieht meine Funktion so aus:
/// <summary> /// Returns the minimum of four numbers. /// </summary> /// <param name="a">First number.</param> /// <param name="b">Second number.</param> /// <param name="c">Third number.</param> /// <param name="d">Fourth number.</param> /// <returns>Minimum of a, b, c and d.</returns> private int Min(int a, int b, int c, int d) { int[] numbers = new int[4]; numbers[0] = a; numbers[1] = b; numbers[2] = c; numbers[3] = d;
Array.Sort(numbers); return numbers[0]; }
Jetzt habe ich mir gedacht, warum schreibe ich nicht gleich ein Array als Parameter rein. Nur weiß ich leider nicht, wie man das Array in so einem Fall auf 4 Zahlen beschränkt. Also es müsste dann irgendwie so aussehen:
private int Min(int[4] numbers)
Aber das geht wohl nicht ... ? Jedenfalls meint das Visual Studio so ...
private int Min(int a, int b, int c, int d) { return Math.Min(Math.Min(a, b), Math.Min(c, d)); }
Zu Deiner zweiten Frage: dass ein als Parameter übergebenes Array genau 4 Elemente enthalten soll, ist eine klassische Vorbedingung. Zum Prüfen von Vorbedingungen gibt es seit .NET 4 die Klasse System.Diagnostics.Contracts.Contract, die hier im Visual-Studio-Magazin vorgestellt wurde. Für Dich sähe das dann so aus:
Siehe sein erstes Beispiel, dort macht er doch genau das... das zweite, ausprogrammierte Beispiel, scheint nur ergänzend (und gefällt mir persönlich obendrein auch noch)
Ah stimmt - sitze gerade an einem 600px hohen Bildschirm, da war das erste Beispiel schon wieder weggescrollt. Aber warum etwas hinschreiben, was der Compiler sowieso erledigt, wenn er foreach behandelt???
Hallo Matthias, das ist Rückblickend betrachtet eine gute Frage :D Ich hatte ein wenig mit IEnumerable und Yield experimentiert und da viel das dabei ab.
Wenn man die Methodensignatur auf public static int Min(IEnumerables<int> values) ändert funktioniert das obere Beispiel nicht korrekt mit Yield. Das untere schon. (Kann dir aus dem Kopf aber gerade auch nicht sagen wieso nicht)