---
title: "Простой функциональный калькулятор."
description: "Механизм делегатов в .NET - очень обширная тема и существует множество способов его применения, от э..."
author: "Hes"
published: "2014-05-21T23:51:41+00:00"
modified: "2014-10-24T01:32:54+00:00"
locale: "ru"
canonical_url: "https://yvision.kz/post/prostoy-funkcionalnyy-kalkulyator-414566"
markdown_url: "https://yvision.kz/post/prostoy-funkcionalnyy-kalkulyator-414566/markdown"
site_name: "Yvision.kz"
---

# Простой функциональный калькулятор.

> Механизм делегатов в .NET - очень обширная тема и существует множество способов его применения, от э...

Механизм делегатов в .NET - очень обширная тема и существует множество способов его применения, от элементарных до, например реализации поставщика данных IQueryable - http://msdn.microsoft.com/ru-ru/library/bb546158.aspx. Пока до этого не дошел, так как материал не самый лёгкий для восприятия, ограничиваюсь более простыми конструкциями:)

Итак. К примеру, есть задача написать нечто, подобное калькулятору для консольного приложения. Как правило программа ожидает такой пользовательский ввод: первое число, операция, второе число. Многие не заморачиваясь, пишут нечто подобное:
- switch (operation)

- {

- case "+": Console.WriteLine("{0}", x + y); break;
- case "-": Console.WriteLine("{0}", x - y); break;
- case "*": Console.WriteLine("{0}", x * y); break;
- case "/": Console.WriteLine("{0}", x / y); break;
- default:
- throw new Exception(String.Format(

- "Непонятная операция: {0}", operation));

- }

 

Но, как видно, такая конструкция не совсем хороша.

Гораздо более интереснее выглядит такой код:
- private static readonly Dictionary> Operations =

- new Dictionary>();
- static void Main(string[] args)

- {

- Operations["+"] = (x, y) => x + y;
- Operations["-"] = (x, y) => x - y;
- Operations["*"] = (x, y) => x * y;
- Operations["/"] = (x, y) => x / y;
- foreach (var func in Operations)

- func.Value(321, 123).Print();
- Console.ReadLine();

- }

 

Здесь мы объявили словарь, где ключом является некая операция, а значением - сопоставленное ключу лямбда-выражение. Расширение Print объявлено следующим образом:
- public static void Print(this T value)

- {

- Console.WriteLine(value);

- }

Как вариант использования:
- Operations["+"](123,123).Print();

На этом пока все, дальше буду писать более интересные вещи, такие как использование предикатов и написание расширений методов Linq.

И кстати, кто-нибудь изучает или применяет F# в повседневной жизни?

---

Source: [https://yvision.kz/post/prostoy-funkcionalnyy-kalkulyator-414566](https://yvision.kz/post/prostoy-funkcionalnyy-kalkulyator-414566)