Вопрос

Мне было интересно, может ли кто-нибудь объяснить, что Func<int, string> есть и как это используется с некоторыми наглядными примерами.

Это было полезно?

Решение

Знакомы ли вы с делегатами в целом?У меня есть страница о делегаты и мероприятия который может помочь, если нет, хотя он больше ориентирован на объяснение различий между ними.

Func<T, TResult> является просто общим делегатом - выясните, что это означает в любой конкретной ситуации, заменив параметры типа (T и TResult) с соответствующим введите аргументы (int и string) в декларации.Я также переименовал его, чтобы избежать путаницы:

string ExpandedFunc(int x)

Другими словами, Func<int, string> является делегатом, который представляет функцию, принимающую int аргумент и возвращающий string.

Func<T, TResult> часто используется в LINQ, как для проекций, так и для предикатов (в последнем случае, TResult всегда есть bool).Например, вы могли бы использовать Func<int, string> спроецировать последовательность целых чисел в последовательность строк. Лямбда - выражения обычно используются в LINQ для создания соответствующих делегатов:

Func<int, string> projection = x => "Value=" + x;
int[] values = { 3, 7, 10 };
var strings = values.Select(projection);

foreach (string s in strings)
{
    Console.WriteLine(s);
}

Результат:

Value=3
Value=7
Value=10

Другие советы

A Func<int, string> потребляет целые числа и возвращает строки.Итак, что потребляет целые числа и возвращает строки?Как насчет этого ?..

public string IntAsString( int i )
{
  return i.ToString();
}

Там я только что создал функцию, которая использует целые числа и возвращает строки.Как бы я это использовал?

var lst = new List<int>() { 1, 2, 3, 4, 5 };
string str = String.Empty;

foreach( int i in lst )
{
  str += IntAsString(i);
}

// str will be "12345"

Не очень сексуально, я знаю, но это простая идея, на которой основано множество трюков.Теперь давайте вместо этого используем функцию.

Func<int, string> fnc = IntAsString;

foreach (int i in lst)
{
  str += fnc(i);
}

// str will be "1234512345" assuming we have same str as before

Вместо вызова IntAsString для каждого элемента я создал ссылку на него с именем fnc (эти ссылки на методы вызываются делегаты) и использовал это вместо этого.(Помните, что fnc использует целые числа и возвращает строки).

Этот пример не очень привлекательный, но тонна умных вещей, которые вы увидите, основана на простой идее функций, делегатов и методы расширения.

Один из лучших праймеров по этому материалу, который я видел, это здесь.У него есть гораздо больше реальных примеров.:)

Это делегат , который принимает одно int в качестве параметра и возвращает значение типа string.

Вот пример его использования:

using System;

class Program
{
    static void Main()
    {
        Func<Int32, String> func = bar;

        // now I have a delegate which 
        // I can invoke or pass to other
        // methods.
        func(1);
    }

    static String bar(Int32 value)
    {
        return value.ToString();
    }
}

Func<int, string> принимает параметр int value и возвращает строковое значение.Вот пример, когда дополнительный вспомогательный метод не требуется.

Func<int, string> GetDogMessage = dogAge =>
        {
            if (dogAge < 3) return "You have a puppy!";
            if (dogAge < 7) return "Strong adult dog!";

            return "Age is catching up with the dog!";
        };

string youngDogMessage = GetDogMessage(2);

ПРИМЕЧАНИЕ:Последний тип объекта в Func (т.е."string" в этом примере) - это возвращаемый функциями тип (т.е.не ограничиваясь примитивами, но любым объектом).Следовательно, Func<int, bool, float> принимает параметры значений int и bool и возвращает значение с плавающей запятой.

Func<int, bool, float> WorthlessFunc = (intValue, boolValue) =>
        {
            if(intValue > 100 && boolValue) return 100;

            return 1;
        };
float willReturn1 = WorthlessFunc(21, false);
float willReturn100 = WorthlessFunc(1000, true);

HTH

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top