นิพจน์ C # lambda สามารถมีมากกว่าหนึ่งคำสั่งได้หรือไม่?


135

นิพจน์ C # แลมบ์ดาสามารถมีคำสั่งมากกว่าหนึ่งคำได้หรือไม่

(แก้ไข: ตามที่อ้างถึงในหลายคำตอบด้านล่างคำถามนี้เดิมถามเกี่ยวกับ "บรรทัด" มากกว่า "ข้อความ")


17
ใช่คุณสามารถใช้หลายบรรทัด ฉันรู้สึกไม่ถูกต้องที่จะตอบแบบเต็ม ๆ
Tesserex

1
@Tesserex - อะไรที่ไม่ทำให้คำตอบ ... คุณพูดถูก!
RQDQ

3
@RQDQ เพราะเป็นคำถามใช่หรือไม่ใช่ฉันไม่รู้สึกว่ามันคุ้มค่าที่ตัวแทนจะได้รับจากการโหวตเพิ่ม
Tesserex

คำตอบ:


200

แน่นอน:

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

32

(ฉันสมมติว่าคุณกำลังพูดถึงข้อความหลายคำมากกว่าหลายบรรทัด)

คุณสามารถใช้หลายคำสั่งในนิพจน์แลมบ์ดาโดยใช้วงเล็บปีกกา แต่เฉพาะไวยากรณ์ที่ไม่ใช้วงเล็บปีกกาเท่านั้นที่สามารถแปลงเป็นแผนภูมินิพจน์ได้:

// 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 จะถือเป็น Func มีวิธีใดในการเพิ่มตรรกะหลายบรรทัดให้กับ Expression Tree หรือไม่? ถ้าไม่ทำไมจึงมีการ จำกัด สิ่งนั้น?
Habeeb

8
@Habeeb: "อย่างไรก็ตามการแสดงออกจะปฏิบัติตาม Func" ไม่เสมอไป หลายครั้งที่ไม่เคยรวบรวมไปยังผู้รับมอบสิทธิ์เลย - เพียงแค่ตรวจสอบเป็นข้อมูล แผนภูมินิพจน์ใน. NET 4.0 ได้รับความสามารถในการรวมหลายคำสั่งผ่านExpression Blockแต่ภาษา C # ไม่รองรับ ทำได้ แต่ต้องใช้การออกแบบ / การใช้งาน / การทดสอบเพิ่มเติม
Jon Skeet

26

คุณสามารถใส่บรรทัดใหม่ได้มากเท่าที่คุณต้องการในนิพจน์แลมบ์ดา C # ละเว้นการขึ้นบรรทัดใหม่

คุณอาจจะหมายถึงการถามเกี่ยวกับหลายงบ

สามารถห่องบหลายรายการไว้ในวงเล็บปีกกา

ดูเอกสาร


17
จะถูกต้องกว่าหรือไม่ที่จะพูดว่า C # ถือว่าช่องว่างทั้งหมดรวมถึงการขึ้นบรรทัดใหม่อย่างเท่าเทียมกัน มันฟังดูเข้าใจผิดเล็กน้อยที่จะบอกว่ามันไม่สนใจการขึ้นบรรทัดใหม่มันทำให้ดูเหมือนว่ามันจะดึงมันออกไปอย่างสมบูรณ์และคุณสามารถแบ่งคำหลักออกเป็นบรรทัดใหม่หรือบางอย่างได้
Tesserex

7

ตั้งแต่ 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 <string, bool> test = name => name == "ใช่";
asawyer

3
Polity กำลังแสดงให้เห็นถึงรูปแบบหลายบรรทัดที่คำถามร้องขอโดยไม่ให้ความบันเทิงกับคำแนะนำในการเล่นกอล์ฟ ในการใช้รหัสที่ชาญฉลาดของคุณจะทำให้ "ไม่ใช่คำตอบ"!
Caius Jard

3

จากLambda Expressions (C # Programming Guide) :

เนื้อความของคำสั่งแลมด้าสามารถประกอบด้วยข้อความจำนวนเท่าใดก็ได้ อย่างไรก็ตามในทางปฏิบัติมักจะมีไม่เกินสองหรือสาม


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

เพิ่มเติมเกี่ยวกับโครงสร้างของ tuples ในเอกสาร

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.