我有这样的代码
senders.FirstOrDefault(sender => !sender.IsBusy);
这条线经常被称为。
问题是它总是返回第一个非忙
sender
;经常返回相同的第一个发件人,但很少返回最后一个发件人。如何轻松平衡?理想情况下,每次调用时我都应该返回最不常用的发件人。 IE。在所有非繁忙发件人之间,选择最后一秒内被选中次数最少的发件人。
最佳答案
如果您想有效地获得最少使用的一个,您可能会使用以下非 Linq“列表轮换”解决方案,这是 O(n)
效率和 O(1)
空间,与大多数其他解决方案不同:
// keep track of these
List<Sender> senders;
int nSelected = 0; // number of already selected senders
// ...
// solution
int total = senders.Count; // total number of senders
// looking for next non-busy sender
Sender s = null;
for (int i = 0; i < total; i++)
{
int ind = (i + nSelected) % total; // getting the one 'after' previous
if (!senders[ind].IsBusy)
{
s = senders[ind];
++nSelected;
break;
}
}
当然,这在
senders
容器上添加了 must-be-indexable 约束。关于c# - 如何用 RandomOrDefault 之类的东西替换 FirstOrDefault 到 "balance"调用?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6953361/