加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 避免泛型函数中的范围问题

发布时间:2020-12-15 08:18:15 所属栏目:百科 来源:网络整理
导读:我来自 PHP和 Javascript的Wild Wild West,您可以从函数返回任何内容.虽然我不喜欢缺乏问责制,但我在努力保持代码“完美”方面也遇到了新的挑战. 我制作了这个通用函数来从列表中选择一个随机元素 public static T PickRandomT(this IListT list) { Random r
我来自 PHP和 Javascript的Wild Wild West,您可以从函数返回任何内容.虽然我不喜欢缺乏问责制,但我在努力保持代码“完美”方面也遇到了新的挑战.

我制作了这个通用函数来从列表中选择一个随机元素

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#中有很多疯狂的事情我不知道,对于这个应用程序,我正在创建我非常,经常必须从列表中选择一个可以在其Count中不断递减的随机元素.有没有更好的办法?

解决方法

你有的选择
return default(T)

这将是一个模棱两可的行为,因为这可能是列表的有效元素.

或者你可以像你说的那样返回-1之类的内容,但这与你的代码完全相关.

或者你可以返回null,但这只能在T是可以为空的类型时才能完成.

在以前的所有情况下,如果调用者不知道这种情况,应用程序可能会继续使用无效值,从而导致未知后果.

所以最好的选择可能是抛出异常:

throw new InvalidOperationException();

通过这种方法,您可以快速失败并确保在调用者的意图之外不会发生任何意外情况.

支持此选项的一个原因.以Linq的扩展方法为例.如果在空列表上调用First(),Single()或Last(),则会收到InvalidOperationException,并显示消息“Sequence contains no elements”.给你的类一个类似于框架类的行为总是一件好事.

由于阿列克谢·列文科夫在问题中的评论,我正在添加旁注.随机生成并不是最好的方法.看看this question.

第二方注意.您正在声明您的函数作为IList< T>的扩展方法. (你通过在第一个参数之前使用它来做到这一点)但是你就像一个静态助手方法一样调用它.扩展方法是一种语法糖,而不是这样做:

foo = Utilites.PickRandom(myList);

让你这样做:

foo = myList.PickRandom();

有关扩展方法的更多信息,请参见here.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读