นิพจน์ C # แลมบ์ดาสามารถมีคำสั่งมากกว่าหนึ่งคำได้หรือไม่
(แก้ไข: ตามที่อ้างถึงในหลายคำตอบด้านล่างคำถามนี้เดิมถามเกี่ยวกับ "บรรทัด" มากกว่า "ข้อความ")
นิพจน์ C # แลมบ์ดาสามารถมีคำสั่งมากกว่าหนึ่งคำได้หรือไม่
(แก้ไข: ตามที่อ้างถึงในหลายคำตอบด้านล่างคำถามนี้เดิมถามเกี่ยวกับ "บรรทัด" มากกว่า "ข้อความ")
คำตอบ:
แน่นอน:
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;
}
);
(ฉันสมมติว่าคุณกำลังพูดถึงข้อความหลายคำมากกว่าหลายบรรทัด)
คุณสามารถใช้หลายคำสั่งในนิพจน์แลมบ์ดาโดยใช้วงเล็บปีกกา แต่เฉพาะไวยากรณ์ที่ไม่ใช้วงเล็บปีกกาเท่านั้นที่สามารถแปลงเป็นแผนภูมินิพจน์ได้:
// 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; };
ตั้งแต่ 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; };
Func<string, bool> test = (name) =>
{
if (name == "yes") return true;
else return false;
}
จากLambda Expressions (C # Programming Guide) :
เนื้อความของคำสั่งแลมด้าสามารถประกอบด้วยข้อความจำนวนเท่าใดก็ได้ อย่างไรก็ตามในทางปฏิบัติมักจะมีไม่เกินสองหรือสาม
ด้วย 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);
}
}
สมมติว่าคุณมีคลาส:
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 ในเอกสาร