none
Делегаты и события RRS feed

  • Вопрос

  • Подскажите как реализовать на с# следующую програму:

    1. Вообще нужно сделать бесконечный цикл в котором есть обработка разных событий при этом не используя конструкций if i case. Наверно делегаты как-то это делают.

    2. Програма работает в tray-е и читает системный консоль.
    Помогите хотя бы с первым.
    • Перемещено Siddharth Chavan 1 октября 2010 г. 21:40 MSDN Forums Consolidation (От:Visual C#)
    13 марта 2010 г. 10:48

Ответы

  • давно так не веселился, смешной код :))))

    delegate void ActionDelegate();
        class Program
        {
            static bool _isBreak=true;
            static void Main(string[] args)
            {
                //справочник действий, работает только для цифр
                Dictionary<string, ActionDelegate> actions = 
                    new Dictionary<string, ActionDelegate>();
                actions.Add("1", () => Console.WriteLine("in 1"));
                actions.Add("2", () => Console.WriteLine("in 2"));
                actions.Add("3", () => Console.WriteLine("in 3"));
                actions.Add("4", () => Console.WriteLine("in 4"));
                actions.Add("5", () => Console.WriteLine("in 5"));
                actions.Add("6", () => Console.WriteLine("in 6"));
                actions.Add("7", () => Console.WriteLine("in 7"));
                actions.Add("8", () => Console.WriteLine("in 8"));
                actions.Add("9", () => _isBreak=false);
    
    
                int i = 0;
                while (_isBreak)
                {
                    //чтение косоли
                    string input = Console.ReadKey().KeyChar.ToString().ToUpper();
    
                    //вызов метода
                    try
                    {
                        actions[input]();
                    }
                    catch(KeyNotFoundException ex) 
                    {
                        //не существующяя в словаре комбинация
                    }
                }
                Console.WriteLine("выход из цикла");
                Console.ReadLine();
            }
        }
    учите что жать надо только цифры, при нажатии буквы - ничего не будет, эксепшн проглотится.

    цифра 9 - выход из цикла

    а потом поди объясни что за
    "actions[input]();"
    )))
    код из разряда,
    а что это за стрелочка?
                int j = 10;
                while(j --> 0)
                {
                    Console.WriteLine(j);
                }

    • Помечено в качестве ответа Иванов12 18 марта 2010 г. 5:27
    17 марта 2010 г. 20:35
  • PashaPash,
    полагаю что у них очень много данных а быстродействие системы критично по времени и перебирать скажем 1000 возможных команд - накладно.

    Да вместо делегатов можно использовать интерфейсы или базовые классы.
    Реализуете столько классов сколько будет действий.
    interface IAction
    {
    void Do();
    }
    Class ActionA: IAction
    Class ActionB: IAction...


    Dictionary<string, IAction> dict = new Dictionary<string, IAction>();
    dict.Add("A", new ActionA());
    dict.Add("B", new ActionB());

    дальше по аналогии
    IAction action = dict[input];
    action.Do();
    • Помечено в качестве ответа Иванов12 18 марта 2010 г. 5:27
    17 марта 2010 г. 20:52

Все ответы

  • Уточните оба вопроса, а то об их смысле остается только догадываться.
    15 марта 2010 г. 9:23
  • Моя програма должна реагировать на введенный текст.
    Вопрос:
    Как мне это сделать не использую конструкций if i case.

    15 марта 2010 г. 15:14
  • Постановка вопроса из разряда "зачем мне холодильник, если я не курю?" :)

    >> Моя програма должна реагировать на введенный текст.
    На введенный текст где? В конкретной программе или в принципе?

    >> Как мне это сделать не использую конструкций if i case.
    Зачем такие ограничения? Это какая-то олимпиадная задача?

    >> Вообще нужно сделать бесконечный цикл
    Бесконечный цикл не нужно делать. Если вам необходимо мониторить какие то события, то для этого, возможно, есть соответвующие инструменты, например FileSystemWatcher для слежением за изменениями файловой системы и т.д.

    15 марта 2010 г. 15:22
  • Не нервничайте. Просто точнее опишите, что за программа и какие действия она должна выполнять.  Куда вводить текст?
    Если это консольное приложение, то я так понимаю, текст вводится с стандартного устройства ввода, тобишь из консольного окна. Программа в цикле должна принимать введенные строки и как-то их интерпретировать без использования условных операторов if-else, switch ??

    16 марта 2010 г. 9:56
  • Не нервничайте. Просто точнее опишите, что за программа и какие действия она должна выполнять.  Куда вводить текст?
    Если это консольное приложение, то я так понимаю, текст вводится с стандартного устройства ввода, тобишь из консольного окна. Программа в цикле должна принимать введенные строки и как-то их интерпретировать без использования условных операторов if-else, switch ??


    Все правильно. Только как это сделать? 
    Я слышал что есть даже несколько вариантов
    16 марта 2010 г. 17:54
  • while (true)
    {
     прочитать текст
     как-то проинтерпретировать
    }
    • Предложено в качестве ответа Иван Пучков 16 марта 2010 г. 18:55
    • Помечено в качестве ответа I.Vorontsov 17 марта 2010 г. 7:52
    • Снята пометка об ответе Иванов12 17 марта 2010 г. 17:14
    • Отменено предложение в качестве ответа Иванов12 17 марта 2010 г. 17:15
    16 марта 2010 г. 18:03
  • вариант №2
    for (; ; )
    {
     прочитать текст
     как-то проинтерпретировать
    }
    
    • Предложено в качестве ответа Иван Пучков 16 марта 2010 г. 18:55
    • Помечено в качестве ответа I.Vorontsov 17 марта 2010 г. 7:52
    • Снята пометка об ответе Иванов12 17 марта 2010 г. 17:14
    • Отменено предложение в качестве ответа Иванов12 17 марта 2010 г. 17:15
    16 марта 2010 г. 18:06
  • вариант №2
    for (; ; )
    
    {
    
     прочитать текст
    
     как-то проинтерпретировать
    
    }
    
    
    
    

    Спасибо конечно за бесконечный цикл, но лучше бы ты написал как это "проинтерпретировать".
    17 марта 2010 г. 17:18
  • пока вы не зададите правильный вопрос, вы не получите на него правильный ответ.
    тут не кружок телепатов.


    приведите хотя бы последовательность ввода, и то что бы вы хотели получить в результате, это был бы более предметный разговор
    17 марта 2010 г. 17:30
  • Например
    введено "1"
    вызивается действее на "1"

    введено "2"
    вызивается действее на "2"

    введено "3"
    создается новое действие.

    Без if i case.
    Несколькими вариантами.
    17 марта 2010 г. 19:31
  • давно так не веселился, смешной код :))))

    delegate void ActionDelegate();
        class Program
        {
            static bool _isBreak=true;
            static void Main(string[] args)
            {
                //справочник действий, работает только для цифр
                Dictionary<string, ActionDelegate> actions = 
                    new Dictionary<string, ActionDelegate>();
                actions.Add("1", () => Console.WriteLine("in 1"));
                actions.Add("2", () => Console.WriteLine("in 2"));
                actions.Add("3", () => Console.WriteLine("in 3"));
                actions.Add("4", () => Console.WriteLine("in 4"));
                actions.Add("5", () => Console.WriteLine("in 5"));
                actions.Add("6", () => Console.WriteLine("in 6"));
                actions.Add("7", () => Console.WriteLine("in 7"));
                actions.Add("8", () => Console.WriteLine("in 8"));
                actions.Add("9", () => _isBreak=false);
    
    
                int i = 0;
                while (_isBreak)
                {
                    //чтение косоли
                    string input = Console.ReadKey().KeyChar.ToString().ToUpper();
    
                    //вызов метода
                    try
                    {
                        actions[input]();
                    }
                    catch(KeyNotFoundException ex) 
                    {
                        //не существующяя в словаре комбинация
                    }
                }
                Console.WriteLine("выход из цикла");
                Console.ReadLine();
            }
        }
    учите что жать надо только цифры, при нажатии буквы - ничего не будет, эксепшн проглотится.

    цифра 9 - выход из цикла

    а потом поди объясни что за
    "actions[input]();"
    )))
    код из разряда,
    а что это за стрелочка?
                int j = 10;
                while(j --> 0)
                {
                    Console.WriteLine(j);
                }

    • Помечено в качестве ответа Иванов12 18 марта 2010 г. 5:27
    17 марта 2010 г. 20:35
  • кстати, почему именно без if и сase?
    17 марта 2010 г. 20:50
  • PashaPash,
    полагаю что у них очень много данных а быстродействие системы критично по времени и перебирать скажем 1000 возможных команд - накладно.

    Да вместо делегатов можно использовать интерфейсы или базовые классы.
    Реализуете столько классов сколько будет действий.
    interface IAction
    {
    void Do();
    }
    Class ActionA: IAction
    Class ActionB: IAction...


    Dictionary<string, IAction> dict = new Dictionary<string, IAction>();
    dict.Add("A", new ActionA());
    dict.Add("B", new ActionB());

    дальше по аналогии
    IAction action = dict[input];
    action.Do();
    • Помечено в качестве ответа Иванов12 18 марта 2010 г. 5:27
    17 марта 2010 г. 20:52
  • Эти два варианта подойдут.
    Но существует ли другой подход без такой структуры даных как (ключ, действие).
    Ради интереса?

    18 марта 2010 г. 5:31
  • Полагаю, что человек, у которого много данных, смог бы задать нормальный вопрос на форуме. Твой вариант, например, в случае "много данных" будет лучше переписать на if (dict.TryGetValue(...)), но низяяя.
    Мне интересно настоящяя причина ограничения :)

    По теме - в первом варианте можно заменить ActionDelegate на System.Action.
    18 марта 2010 г. 6:33
  • Да это какая-то неправильно сформулированная задача из школьного курса. У Кнута есть же алгоритм Евклида:
    1) r = m mod n
    2) if(r == 0) exit answer n
    3) m = n, n = r, go 1)
    Изменить алгоритм так, чтоб не использовать операций присваивания m=n, n = r. Вот из той же оперы задача, просто плохо сформулирована.

    18 марта 2010 г. 11:22
  • Изменить алгоритм так, чтобы не использовать операций.
    18 марта 2010 г. 13:19