Func的解释

zSy*_*sis 89 .net c# func

我想知道是否有人可以Func<int, string>通过一些明确的例子解释它是什么以及如何使用它.

Jon*_*eet 142

你是否熟悉一般的代表?我有一个关于代表和事件的页面,如果没有,可能会有所帮助,尽管它更适合解释两者之间的差异.

Func<T, TResult>只是一个通用委托 - 通过在声明中用相应的类型参数(和)替换类型参数(TTResult)来解决它在任何特定情况下的含义.我也重命名它以避免混淆:intstring

string ExpandedFunc(int x)
Run Code Online (Sandbox Code Playgroud)

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

Func<T, TResult>在LINQ中经常使用,用于投影和谓词(在后一种情况下,TResult总是如此bool).例如,您可以使用a 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);
}
Run Code Online (Sandbox Code Playgroud)

结果:

Value=3
Value=7
Value=10
Run Code Online (Sandbox Code Playgroud)

  • 所以你打算将你认为没有特别喜欢的答案给你的每一个答案都下来吗?这个答案是否有效*无益*,您认为?你认为或许有多种方式看待事物可能不是一个坏主意吗? (10认同)
  • @TheSoftwareJedi:不,当然,没有理由亲自接受你的downvote事实 - 你在周六因为个人原因而*做了*downvote,然后在我们经过长时间的讨论之后才*进入这个线程关于适当行为的电子邮件是*完全*巧合,不是吗? (8认同)
  • "换句话说,它是一个委托,它代表一个带有int参数并返回一个字符串的函数." 为了避免让别人感到困惑,我会澄清你在谈论Func <int,string>,而不是Func <T,TResult>.很明显,如果您理解泛型类型和委托,但对于那些不是Func <int,string>的人,kan委托给一个接受int参数并返回一个字符串的函数. (3认同)
  • 我认为这实际上并不像MSDN的描述和示例那样清晰.我还认为你应该添加关于最后一个类型参数如何是返回类型的信息 - 澄清Func <int,int,string>返回字符串并获取2个int.这有助于澄清.没有什么是个人的 - 我只是觉得它不够清楚. (2认同)

JP *_*oto 40

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

public string IntAsString( int i )
{
  return i.ToString();
}
Run Code Online (Sandbox Code Playgroud)

在那里,我只是编写了一个吃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"
Run Code Online (Sandbox Code Playgroud)

我知道,这不是很性感,但这是一个很简单的想法,很多技巧是基于.现在,让我们使用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
Run Code Online (Sandbox Code Playgroud)

我没有在每个成员上调用IntAsString,而是创建了一个名为fnc的引用(这些对方法的引用称为委托)并改为使用它.(记住fnc吃掉int并返回字符串).

这个例子不是很性感,但是你会看到很多聪明的东西都是基于函数,委托和扩展方法的简单概念.

我见过的最好的引物之一就在这里.他有更多真实的例子.:)

  • 我喜欢这个解释 (5认同)

And*_*are 27

它是一个委托,它将一个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();
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 谢谢安德鲁.你的意思是写func(1)而不是bar(1)吗? (3认同)