C # 람다 식에 둘 이상의 문이있을 수 있습니까?


131

C # 람다 식에 둘 이상의 문이 포함될 수 있습니까?

(편집 : 아래의 여러 답변에서 언급 했듯이이 질문은 원래 "문"이 아닌 "줄"에 대해 질문했습니다.


17
예, 여러 줄을 사용할 수 있습니다. 나는 그것을 완전한 답으로 만드는 것이 옳지 않다고 생각합니다.
Tesserex

1
@Tesserex-대답하지 않는 것 ... 맞아요!
RQDQ

3
@RQDQ 예 또는 전혀 의문의 여지가 있기 때문에 공감대에서 생성 한 담당자의 가치가 있다고 생각하지 않습니다.
Tesserex

답변:


195

확실한:

List<String> items = new List<string>();

var results = items.Where(i => 
            {
                bool result;

                if (i == "THIS")
                    result = true;
                else if (i == "THAT")
                    result = true;
                else
                    result = false;

                return result;
            }
        );

31

(나는 당신이 실제로 여러 줄이 아닌 여러 진술에 대해 이야기하고 있다고 가정합니다.)

중괄호를 사용하여 람다 식에 여러 명령문을 사용할 수 있지만 중괄호를 사용하지 않는 구문 만 표현식 트리로 변환 할 수 있습니다.

// Valid
Func<int, int> a = x => x + 1;
Func<int, int> b = x => { return x + 1; };        
Expression<Func<int, int>> c = x => x + 1;

// Invalid
Expression<Func<int, int>> d = x => { return x + 1; };

1
Func가 중괄호를 허용하고 Expression이 허용하지 않는 이유를 이해하려고합니다. 어쨌든 Expression은 Func를 준수합니다. Expression Tree에 여러 줄 논리를 추가하는 방법이 있습니까? 아니라면 왜 제한 하는가?
Habeeb

8
@Habeeb : "Anyway Expression은 Func로 준수합니다"항상 그런 것은 아닙니다. 많은 시간이 델리게이트로 컴파일되지 않으며 데이터로 검사됩니다. .NET 4.0에서 표현의 나무를 통해 여러 문을 포함 할 수있는 능력 확보했다 Expression.Block 하지만 C #을 언어 것을 지원하지 않습니다. 가능하지만 더 많은 설계 / 구현 / 테스트 작업이 필요합니다.
Jon Skeet

26

람다 식에 원하는만큼 줄 바꿈을 넣을 수 있습니다. C #은 줄 바꿈을 무시합니다.

당신은 아마 여러 진술 에 대해 물어볼 것입니다 .

여러 문장을 중괄호로 묶을 수 있습니다.

설명서를 참조하십시오 .


17
C #이 줄 바꿈을 포함한 모든 공백을 똑같이 처리한다고 말하는 것이 더 정확하지 않습니까? 줄 바꿈을 무시한다고 말하는 것은 약간 오해의 소지가 있습니다. 완전히 줄 바꿈하는 것처럼 보이므로 키워드를 줄 바꿈 또는 다른 것으로 나눌 수 있습니다.
Tesserex

6

C # 7부터 :

한 줄 진술 :

int expr(int x, int y) => x + y + 1; 

여러 줄로 된 진술 :

int expr(int x, int y) { int z = 8; return x + y + z + 1; };

이것들은 로컬 함수라고하지만, 이것은 다음보다 약간 깨끗해 보이고 실제로 동일하다고 생각합니다

Func<int, int, int> a = (x, y) => x + y + 1;

Func<int, int, int> b = (x, y) => { int z = 8; return x + y + z + 1; };

4
Func<string, bool> test = (name) => 
{
   if (name == "yes") return true;
   else return false;
}

5
Func <문자열, bool> test = 이름 => name == "yes";
asawyer

3
Polity는 골프 제안을 즐기지 않고 질문에 의해 요청 된 멀티 라인 형식을 시연하고 있습니다. 현명한 코드를 구현하면 "답이 아닙니다"!
Caius Jard


0

C # 7.0을 사용하면 다음과 같이 사용할 수도 있습니다

Public string ParentMethod(int i, int x){
    int calculation = (i*x);
    (string info, int result) InternalTuppleMethod(param1, param2)
    {
        var sum = (calculation + 5);
        return ("The calculation is", sum);
    }
}

0

수업이 있다고 가정 해 봅시다.

    public class Point
    {
        public int X { get; set; }
        public int Y { get; set; }
    }

이 클래스 안에 C # 7.0을 사용하면 중괄호 없이도 할 수 있습니다.

Action<int, int> action = (x, y) => (_, _) = (X += x, Y += y);

Action<int, int> action = (x, y) => _ = (X += x, Y += y);

다음과 같습니다.

Action<int, int> action = (x, y) => { X += x; Y += y; };

정규 메소드 나 생성자를 한 줄에 작성해야하거나 하나 이상의 표현식 / 팩션을 하나의 표현식으로 묶어야하는 경우에도 유용 할 수 있습니다.

public void Action(int x, int y) => (_, _) = (X += x, Y += y);

또는

public void Action(int x, int y) => _ = (X += x, Y += y);

또는

public void Action(int x, int y) => (X, Y) = (X + x, Y + y);

문서에서 튜플의 해체에 대한 자세한 내용 .

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