c# - 我想要一种让每个人都有平等机会的方法我如何在 C# 中做到这一点?

标签 c# logic equals

我有一个函数,像这样,

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/

相关文章:

java - 以这种方式覆盖 `equals()` 有什么缺点?

c# - 为什么不能控制留下 finally 声明?

c# - linq to sql 从性能索引列开始

php 将结果集逻辑组织到嵌套的 JSON

mysql - 表字段国际化

logic - 求解命题逻辑规则集中的特定组合(SAT Solver)

c# - 自定义类作为 C# 中字典的键不起作用

java - 正确覆盖 equals 方法

c# - 如何在 json 请求的方法中路由

C#:带有构造函数参数的对象数组