我有这样的功能,

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/

10-11 12:24