请教个问题:时刻保持有10个人数可以操作,当有第11号人去激活后第11号人的前10人才可以操作,但是当前的第11号不能操作要等到第21个人激活后才可以操作,这个怎么设计

解决方案 »

  1.   


    class OperationQueue
    {
        private List<bool> Statuses = new List<bool>();    public void AddOperator()
        {
            if (Statuses.Count % 10 == 0 && Statuses.Count > 0)
            {
                Statuses.ForEach(b => { if (!b) b = true; });
            }
            Statuses.Add(false);
        }
        public void AddOperators(int count)
        {
            Parallel.For(0, count, i => Statuses.Add(false));
            int remainCount = Statuses.Count % 10;
            Parallel.For(0, Statuses.Count - remainCount, i => { if (!Statuses[i]) Statuses[i] = true; });
        }
        public override string ToString()
        {
            return String.Join<int>(", ", Statuses.Select(b => Convert.ToInt32(b)).ToArray());
        }
    }class Program
    {
        static void Main(string[] args)
        {
            OperationQueue queue = new OperationQueue();
            queue.AddOperator();
            queue.AddOperator();
            queue.AddOperator();
            queue.AddOperator();
            Console.WriteLine(queue);
            queue.AddOperators(6);
            Console.WriteLine(queue);
            queue.AddOperator();
            Console.WriteLine(queue);
            queue.AddOperators(9);
            Console.WriteLine(queue);
            queue.AddOperators(3);
            Console.WriteLine(queue);
        }
    }
      

  2.   


    呵呵,跟队列有什么关系哟~~~ 想问题不要拍脑袋,这题的关键就是取模,
    我的代码里有用到 Queue 吗?也没有用到 Queue 的特性吧。
      

  3.   

    那你为什么命名为OperationQueue
      

  4.   

    命名中带的 Queue 和数据结构的队列是两回事,按照楼主的逻辑,他就是顺序进来的,就好像排成一个长队,那这个 Operator 的长队就可以用 Queue 来命名,我封装了之后,在你外部调用看来,就很好理解、也很形象,请看 Main 函数测试代码。但是真正的实现对于使用者来说不需要知道。
    你也可以为这个 OperationQueue 添加其他的方法,EnQueue,DeQueue,等等,但是操作是封装起来的,队列的那些操作逻辑概念是对于外部调用者而言的,但是具体的内部实现是不一样的。就好像 FCL 自己的 Queue<T>,FIFO 这种逻辑也是对于我们使用者的开发人员来说的,它内部的实现却是另外一套思路和逻辑。