Func의 설명


89

나는 누군가가 무엇인지 Func<int, string>그리고 그것이 몇 가지 명확한 예와 함께 어떻게 사용되는지 설명 할 수 있는지 궁금 했습니다.

답변:


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 <T, TResult>가 아니라 여기서 Func <int, string>에 대해 이야기하고 있음을 분명히 할 것입니다. 제네릭 타입과 델리게이트를 이해한다면 분명하지만, 그렇지 않은 사람들에게는 int 인수를 받아 문자열을 반환하는 함수에 위임하는 것은 Func <int, string>입니다.
진짜 napster

나중에 PC로 돌아올 때 명확 해집니다.
Jon Skeet

2
나는 이것이 실제로 MSDN의 설명과 예만큼 명확하지 않다고 생각합니다. 또한 Func <int, int, string>이 ​​문자열을 반환하고 2 개의 int를 취한다는 점을 명확히하여 마지막 형식 매개 변수가 반환 형식 인 방법에 대한 정보를 추가해야한다고 생각합니다. 그것은 명확히하는 데 도움이됩니다. 개인적인 것은 없습니다-나는 그것이 충분히 명확하다고 생각하지 않았습니다.
TheSoftwareJedi

11
특정 즐겨 찾기만큼 도움이되지 않는다고 생각되는 모든 답변에 대해 반대 투표를 하시겠습니까? 이 답변이 적극적으로 도움이되지 않습니까? 사물을 보는 방법이 한 가지 이상인 것이 나쁜 생각이 아닐 수도 있다고 생각하십니까?
Jon Skeet

8
@TheSoftwareJedi : 없음은 물론, 이유는 개인적으로 downvote을 없습니다 - 당신은 사실 바로 다음 토요일에 개인적인 이유로 downvote을하고 무슨 일이 있었 우리는 적절한 행동에 대한 이메일에 긴 토론을하고있었습니다 후이 스레드에 올를 이다 완전히 그것은 우연의 일치되지 않는 이유는 무엇입니까?
Jon Skeet

40

A Func<int, string>는 int를 먹고 문자열을 반환합니다. 그렇다면 정수를 먹고 문자열을 반환하는 것은 무엇입니까? 이건 어때 ...

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는 int를 먹고 문자열을 반환합니다.)

이 예제는 그다지 섹시하지는 않지만, 여러분이 보게 될 많은 영리한 것들은 함수, 델리게이트 및 확장 메서드 에 대한 단순한 아이디어를 기반으로합니다 .

내가 본 것들에 대한 최고의 입문서 중 하나는 여기 입니다. 그는 더 많은 실제 사례를 가지고 있습니다. :)


@Therealnapster 나도 그것을 좋아하지만 나는 당신의 이름을 더 좋아합니다.
BKSpurgeon 2016

28

하나 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();
    }
}

3
고마워 앤드류. bar (1) 대신 func (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);

HTH

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.