我有一个函数,像这样,
private void Step()
{
foreach (A a in aList)
a.Act();
foreach (B b in bList)
b.Act();
foreach (C c in cList)
c.Act();
}
其中“a”获得第一次机会,“b”获得下一个机会,“c”获得最后一次机会,
我想要一种让每个人都有平等机会的方法我如何在 C# 中做到这一点?
非常感谢大家的帮助!!!
最佳答案
我会定义一个接口(interface)IActable
(选择你的名字)定义Act()
.
public interface IActable
{
void Act();
}
使 A、B 和 C 实现 IActable。然后,更改您的功能以执行以下操作。
private void Step()
{
var all = new List<IActable>();
all.AddRange(aList);
all.AddRange(bList);
all.AddRange(cList);
all = all.Shuffle(new Random());
foreach (IActable a in all)
{
a.Act();
}
}
洗牌法,stolen from here
public static IEnumerable<T> Shuffle<T>(this IEnumerable<T> source, Random rng)
{
T[] elements = source.ToArray();
// Note i > 0 to avoid final pointless iteration
for (int i = elements.Length-1; i > 0; i--)
{
// Swap element "i" with a random earlier element it (or itself)
int swapIndex = rng.Next(i + 1);
T tmp = elements[i];
elements[i] = elements[swapIndex];
elements[swapIndex] = tmp;
}
// Lazily yield (avoiding aliasing issues etc)
foreach (T element in elements)
{
yield return element;
}
}
使用 plinq 的并行实现. (订单未保留)
private void Step()
{
var all = new List<IActable>();
all.AddRange(aList);
all.AddRange(bList);
all.AddRange(cList);
all.AsParallel().ForAll(a=>a.Act());
}
关于c# - 我想要一种让每个人都有平等机会的方法我如何在 C# 中做到这一点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5707010/