功能说明


89

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

Answers:


145

您一般对代表熟悉吗?我有一个有关委托人和事件的页面这可能会有所帮助,尽管它更适合于解释两者之间的差异。

Func<T, TResult>只是一个通用委托-通过在声明中将类型参数TTResult)替换为相应的类型参数intstring)来弄清楚在任何特定情况下的含义。为了避免混淆,我还对其进行了重命名:

string ExpandedFunc(int x)

换句话说,Func<int, string>是代表函数的代表,该函数接受int参数并返回string

Func<T, TResult>在LINQ中经常使用,用于投影和谓词(在后一种情况下,TResult始终为bool)。例如,您可以使用Func<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

3
“换句话说,它是一个代表,它代表一个带有int参数并返回字符串的函数。” 为了避免与其他人混淆,我将澄清您在这里谈论的是Func <int,string>而不是Func <T,TResult>。很明显,如果您了解泛型类型和委托,但对于那些不了解的类型和委托,则是Func <int,string>将委托委托给带有int参数并返回字符串的函数。
09年

稍后再说明何时返回PC。
乔恩·斯基特

2
我认为这实际上还不如MSDN的描述和示例清楚。我还认为您应该添加有关最后一个参数类型如何是返回类型的信息-阐明Func <int,int,string>返回string并采用2个int。这有助于澄清。没有什么私人的-我只是觉得不够清楚。
TheSoftwareJedi,2009年

11
那么,您是否会拒绝您认为不如您所喜欢的每个答案那么有用的每个答案?这个答案是否积极无用,您认为吗?您是否认为拥有多种观察事物的方法可能不是一个坏主意?
乔恩·斯基特

8
@TheSoftwareJedi:不,当然,没有理由对您的个人否决票进行投票-事实上,您在周六出于个人原因进行投票,然后在我们就适当行为的电子邮件进行了长时间的讨论之后,碰巧进入了这个话题是完全巧合,不是吗?
乔恩·斯基特

40

A Func<int, string>吃掉整数并返回字符串。那么,什么吃整数并返回字符串呢?这个怎么样 ...

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

在那里,我刚刚组成了一个吃掉int并返回字符串的函数。我将如何使用它?

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(这些对方法的引用称为委托),并使用了该引用。(记住,fnc吃掉int并返回字符串)。

这个例子不是很性感,但是您将看到很多聪明的东西是基于函数,委托和扩展方法的简单思想的。

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


@Therealnapster我也喜欢,但我更喜欢你的名字。
BKSpurgeon '16

27

它是一个委托,它使用一个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();
    }
}

3
谢谢安德鲁。您是要写func(1)而不是bar(1)吗?
zSynopsis

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值参数,并返回一个float值。

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);

高温超导

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.