【发布时间】:2011-08-05 08:17:43
【问题描述】:
我有这样的代码
senders.FirstOrDefault(sender => !sender.IsBusy);
这条线经常被调用。
问题是它总是返回第一个不忙的sender;经常返回相同的第一个发件人,但很少返回最后一个发件人。如何轻松平衡?
理想情况下,在每次通话时,我都应该返回最不常用的发件人。 IE。在所有非忙碌发件人之间选择在最后一秒内被选中次数最少的发件人。
【问题讨论】:
-
你想要伪随机还是最不忙?最不忙意味着您保留谁忙谁不忙的历史记录,并参考该历史记录来确定一段时间内最不忙的发件人。
-
伪随机将是一个很大的改进,但是最好保留历史记录,因为报告“负载”(每秒发送数)会很好,如果可以的话也很好“限制”负载
-
您有很多建议使用
RandomOrDefault或Shuffle扩展方法的答案。如果您使用这些解决方案中的任何一个,请记住尽快过滤掉尽可能多的发件人:senders.Shuffle().FirstOrDefault(s => !s.IsBusy)(不好,因为不需要对忙碌的发件人进行洗牌)vs.senders.Where(s => !s.IsBusy).RandomOrDefault()(好)。理想情况下,你应该有一个扩展方法可以做到这两个:senders.RandomOrDefault(s => !s.IsBusy) -
检查我的非随机方法的解决方案
-
@stakx,我认为您的评论并非 100% 准确。如果您的
RandomOrDefault方法采用谓词,则在RandomOrDefault之前调用Where是没有意义的...哦,抱歉错过了提到这一点的评论的最后一部分。