Операторы как параметры метода в C#

** указатель на указатель.

Это могла бы быть матрица (массив массивов) или массив строк (char массив), и т.д.

8
задан Jonas Elfström 7 October 2009 в 09:04
поделиться

2 ответа

Проще говоря, вы можете просто использовать лямбда:

public void DoSomething(Func<int, int, int> op)
{
    Console.WriteLine(op(5, 2));
}

DoSomething((x, y) => x + y);
DoSomething((x, y) => x * y);
// etc

Это не очень интересно. Было бы хорошо, если бы все эти делегаты были подготовлены для нас. Конечно, вы можете сделать это с помощью статического класса:

public static class Operator<T>
{
     public static readonly Func<T, T, T> Plus;
     public static readonly Func<T, T, T> Minus;
     // etc

     static Operator()
     {
         // Build the delegates using expression trees, probably
     }
}

Действительно, Марк Гравелл сделал нечто очень похожее в MiscUtil , если хотите. Затем вы можете позвонить:

DoSomething(Operator<int>.Plus);

Это не совсем красиво, но, как мне кажется, это наиболее близкий вариант, поддерживаемый на данный момент.

Боюсь, я действительно не понимаю материал Ruby, поэтому не могу комментировать что ...

8
ответ дан 5 December 2019 в 17:38
поделиться

Следующее является прямым, буквальным (насколько это возможно) переводом C #:

(Func<int>)(x => x * x)(
    Enumerable.Range(1, 100)
        .Where(x => x % 2 == 1)
        .Aggregate((x, y) => x + y))

В частности:

  • блоки: {||} - становятся лямбдами: =>
  • select становится Где
  • вводить становится Агрегат
  • в становится прямым вызовом экземпляра лямбды
2
ответ дан 5 December 2019 в 17:38
поделиться