Wednesday, December 30, 2009

Немного о лямбда-выражениях

Наконец-то хорошенько разобрался в лямбда-выражениях в C#. Сначала выносило мозг, но потом все стало понятно и очевидно. До сих пор неясно, почему MS и топ-девелоперы побуждают (в основном своим примером) всюду, где только возможно, использовать лямбда-выражения. Ведь зачастую они не так эффективны как вызов функции с использованием старых добрых циклов. Поясню на примере.
Допустим, что необходимо определить состоит ли заданная строка только из цифр. Ниже приведены четыре различных варианта реализующие эту функциональность.

    public static bool ContainsOnlyDigits_1(this string str)
    {
      for (int i = 0; i < str.Length; i++)
        if (!Char.IsDigit(str[i]))
          return false;
      return true;
    }

    public static bool ContainsOnlyDigits_2(this string str)
    {
      return str.Where(Char.IsDigit).
          Count().
          Equals(str.Length);
    }

    public static bool ContainsOnlyDigits_3(this string str)
    {
      return str.Count(Char.IsDigit).Equals(str.Count());
    }

    public static bool ContainsOnlyDigits_4(this string str)
    {
      return (from c in str
          where Char.IsDigit(c)
          select c).Count().Equals(str.Length);
    }


* This source code was highlighted with Source Code Highlighter.


Реализовать это можно еще сотней способов, но они мало чем будут отличаться друг от друга. Самыми красивыми и понятными мне кажутся первый и третий варианты. На мой взгляд, вариант с LINQом вообще сложно читать. Самым быстрым, очевидно, будет первый вариант. В подтверждение, я провел серию тестов – результаты на диаграмме.




В общем, не надо злоупотреблять лямбда-выражениями, тем более для простых вещей.

No comments: