我有这样的功能,
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#中做到呢?
非常感谢所有帮助!!!
最佳答案
我将定义一个定义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/