90

我想知道是否有人可以Func<int, string>通过一些清晰的示例来解释什么是以及如何使用它。

4

4 回答 4

147

你对代表很熟悉吗?我有一个关于代表和事件的页面,如果没有,它可能会有所帮助,尽管它更倾向于解释两者之间的差异。

Func<T, TResult>只是一个通用委托 - 通过在声明中将类型参数( Tand TResult) 替换为相应的类型参数( intand string) 来确定它在任何特定情况下的含义。我还重命名了它以避免混淆:

string ExpandedFunc(int x)

换句话说,Func<int, string>是一个代表一个函数的委托,它接受一个int参数并返回一个string.

Func<T, TResult>在 LINQ 中经常用于预测和谓词(在后一种情况下,TResult总是bool)。例如,您可以使用 aFunc<int, string>将整数序列投影到字符串序列中。Lambda 表达式通常在 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
于 2009-05-18T16:53:45.130 回答
41

AFunc<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 代替。

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 (这些对方法的引用称为delegates)并改用它。(记住 fnc 吃整数并返回字符串)。

这个例子不是很吸引人,但是你会看到很多聪明的东西都是基于函数、委托和扩展方法的简单思想。

我见过的关于这些东西的最好的入门书之一是这里。他还有很多真实的例子。:)

于 2009-05-18T17:18:19.447 回答
29

它是一个委托,它接受一个int作为参数并返回一个 type 的值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();
    }
}
于 2009-05-18T16:48:51.363 回答
1

Func<int, string>接受一个 int 值参数并返回一个字符串值。这是一个不需要额外支持方法的示例。

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 中的最后一个对象类型(即本例中的“字符串”)是函数返回类型(即不限于原语,而是任何对象)。因此,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);

高温高压

于 2018-07-24T17:08:24.597 回答