Callcenter (C#) : разбор полетов

Опубликовано Apr 3, 2013 в ООП | Нет комментариев

, ,

Callcenter (C#) : разбор полетов

В нашем очень старом посте Callcenter появилось, наконец-то, решение, спасибо автору. Оно прокомментировано и было обещано опубликовать некоторые куски кода на эту тему. Вот этот код. За основу взято исходное решение, в котором оставлено только то, что непосредственно относится к действиям по поиску оператора.

Код классов для задачи Callcenter на C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace CALL_CENTER
{
    public class Operator : IComparable
    {
        int Id;
        int rank;
        bool isFree;
 
        public int CompareTo(object obj)
        {
            Operator o = (Operator)obj;
            int ret = 0;
            if (this.isFree)
            {
                ret = this.rank.CompareTo(o.rank);
                return ret;
            }
            return ret;
        }
 
        public Operator(int Id, int rank, bool isFree)
        {
            this.Id = Id;
            this.rank = rank;
            this.isFree = isFree;
        }
        public bool GetStatus()
        {
            return isFree;
        }
        public void SetStatus(bool setStatus)
        {
            isFree = setStatus;
        }
        public int GetRank()
        {
            return rank;
        }
 
        public int GetID()
        {
            return Id;
        }
 
        public void Call()
        {
             isFree = false;
         }
     }
 
    class CallCenter
    {
        List _operators = new List();
 
        public void AddOperator(int _Id, int _rank, bool _isFree)
        {
            _operators.Add(new Operator(_Id, _rank, _isFree));
        }
 
        public int getCallHandler()
        {
            if (_operators == null)
                return -1;
 
            Operator o_ret = _operators.Min();
 
            if (o_ret.GetStatus())
            {
                o_ret.Call();
                return o_ret.GetID();
            }
            else
                return -1;
        }
 
        public int getCallHandler1()
        {
            if (_operators == null)
                return -1;
 
           Operator free_op =
              _operators.Where(x => x.GetStatus()).OrderBy
                 (x => x.GetRank()).FirstOrDefault();
 
           if (free_op != null)
           {
               free_op.Call();
               return free_op.GetID();
           }
           else
               return -1;
         }
     }  
   class Program
    {
       static void Main(string[] args)
        {
            CallCenter callCenter = new CallCenter();
 
            callCenter.AddOperator(1, 2, false);
            callCenter.AddOperator(2, 1, false);
            callCenter.AddOperator(3, 2, true);
            callCenter.AddOperator(4, 0, false);
            callCenter.AddOperator(5, 2, false);
            callCenter.AddOperator(6, 1, true);
            callCenter.AddOperator(7, 0, true);
 
            int first_Free = callCenter.getCallHandler();
 
            int first_Free1 = callCenter.getCallHandler1();
 
        }
     }
 }

В приведенном выше коде показано, как еще можно реализовать метод getCallHandler(), если использован C#. Цель – показать использование разнообразных готовых средств языка. Показана реализации метода поиска свободного оператора, удовлетворяющего условия из исходного поста.

Метод getCallHandler(). Он находит и возвращает результат для ситуации, когда класс Operator реализует интерфейс IComparable именно так, как описано в условии поиска оператора. Описано это в методе CompareTo.

Метод getCallHandler1(). Если же IComparable.CompareTo реализован классом Operator иначе (а это очень даже может быть) или не реализован вообще, тогда способ выбора оператора нужно задавать непосредственно в методе getCallHandler(). Так как по сути этот выбор сводится к фильтрации по  полю isFree с последующей сортировкой по полю rank и после этого взятию первого по порядку элемента, то LINQ-запрос здесь очень удачное решение. Что и сделано в методе getCallHandler1().

 


Автор публикации:

Оставить комментарий

Ваш адрес email не будет опубликован.


*