我有这样的代码

    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/

10-11 07:33