Ich komme aus dem Wild Wild West von PHP und Javascript, wo Sie alles aus einer Funktion zurückgeben können. Während ich diesen Mangel an Verantwortlichkeit hasse, stehe ich auch vor einer neuen Herausforderung, meinen Code "perfekt" zu halten.Vermeiden von Bereichsüberschreitungen in allgemeinen Funktionen
Ich habe diese generische Funktion ein zufälliges Element aus einer Liste will
public static T PickRandom<T>(this IList<T> list) {
Random random = new Random();
int rnd = random.Next(list.Count);
return list[rnd];
}
Aber ich holen mich aus mit mit 0 Werten auf eine Liste zu schützen. Natürlich kann ich von dieser Funktion außer T nichts zurückgeben, wie zum Beispiel false oder -1. Ich kann natürlich tun dies
if(myList.Count > 0)
foo = Utilites.PickRandom(myList);
Allerdings gibt es so viele verrückte Dinge in C#, die ich weiß nicht, über, und für diese App Ich schaffe ich sehr, sehr oft ein Zufallselement aus einem wählen Liste, die in ihrer Zählung ständig dekrementiert werden könnte. Gibt es einen besseren Weg?
Was passieren soll, wenn einige dieser Methode auf eine leere Liste nicht nennen? – Rob
Ich denke, es sollte nichts zurückgeben, aber das ist nicht möglich? – user3822370
Wenn die Liste Referenztypen (z. B. Objekte) enthält, können Sie das tun. Aber das funktioniert nicht für Dinge wie "int", außer du sagst explizit, dass es null-fähig ist. Es scheint mir, dass es ** ungültig ist, diese Methode auf einer leeren Liste aufzurufen, daher sollte eine Ausnahme in Ordnung sein. Die Rückgabe von null könnte für den Aufrufer unerwartet sein. Ich würde eine Ausnahme auslösen, wenn Count == 0 in der PickRandom-Methode. Außerdem sollten Sie folgendes verwenden: 'random.Next (list.Count - 1)', oder Sie können eine Ausnahme erhalten, wenn Sie versuchen, auf das Element 'last + 1' zuzugreifen. – Rob