【发布时间】:2015-07-22 00:15:58
【问题描述】:
我来自 PHP 和 Javascript 的狂野西部,您可以从函数返回任何内容。虽然我确实讨厌缺乏责任感,但我在努力保持我的代码“完美”方面也面临着新的挑战。
我做了这个通用函数来从列表中选择一个随机元素
public static T PickRandom<T>(this IList<T> list) {
Random random = new Random();
int rnd = random.Next(list.Count);
return list[rnd];
}
但我想保护自己不要在值为 0 的列表中使用它。显然我不能从这个函数返回除 T 以外的任何东西,例如 false 或 -1。我当然可以这样做
if(myList.Count > 0)
foo = Utilites.PickRandom(myList);
但是,C# 中有很多我不知道的疯狂事物,对于我正在创建的这个应用程序,我经常不得不从列表中选择一个随机元素,该元素的计数可能会不断递减。有没有更好的办法?
【问题讨论】:
-
如果有人在空列表上调用此方法会发生什么?
-
如果列表包含引用类型(例如对象),您可以这样做。但这不适用于
int之类的东西,除非你明确说它可以为空。在我看来,在一个空列表上调用这个方法是 invalid 的,所以例外应该没问题。返回 null 对于调用者来说可能是意外的。如果 PickRandom 方法中的 count == 0,我会抛出异常。此外,您应该使用这个:random.Next(list.Count - 1),否则您会在尝试访问last+1元素时遇到异常。 -
@Rob 我对你的最后一句话感到困惑。假设您有一个包含 4 个元素的列表。如果你调用 random.Next(list.Count) 它应该只返回 0/1/2/3 no?
-
你是对的,@user3822370。
Next(int)返回介于0和value - 1之间的任何值。 -
对不起,你是对的。我将它与另一个具有最大值
inclusive的库混淆了。