Ducky Coder
Published on

10 LINQ ที่นักพัฒนา C# ทุกคนต้องรู้

 
10 LINQ ที่นักพัฒนา C# ทุกคนต้องรู้

LINQ (Language Integrated Query) เป็นหนึ่งในความสามารถที่ทรงพลังที่สุดใน C# ช่วยให้นักพัฒนาสามารถดึงข้อมูลในคอลเล็กชัน ฐานข้อมูล XML และแหล่งข้อมูลอื่นๆ ได้อย่างกระชับ และอ่านง่าย ไม่ว่าคุณจะทำงานกับคอลเล็กชันในหน่วยความจำหรือฐานข้อมูลผ่าน Entity Framework LINQ จะช่วยเพิ่มประสิทธิภาพการทำงานได้อย่างมาก

มาดูกันว่า 10 คำสั่ง LINQ ต้องรู้ มีอะไรบ้าง

1. กรองข้อมูลด้วย Where

คำสั่ง Where กรองข้อมูลตามเงื่อนไข

ตัวอย่าง: กรองเฉพาะเลขคู่

var numbers = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
var evenNumbers = numbers.Where(n => n % 2 == 0);

Console.WriteLine(string.Join(", ", evenNumbers));
// ผลลัพธ์: 2, 4, 6, 8, 10

👉 กรณีการใช้งาน: กรองเฉพาะข้อมูลที่ต้องการ

2. เลือกข้อมูลด้วย Select

Select ใช้เพื่อเลือกข้อมูลหรือแปลงข้อมูลตามที่ต้องการ

ตัวอย่าง: แปลงตัวเลขเป็นกำลังสอง

var squaredNumbers = numbers.Select(n => n * n);

Console.WriteLine(string.Join(", ", squaredNumbers));
// เอาต์พุต: 1, 4, 9, 16, 25, 36, 49, 64, 81, 100

👉 กรณีการใช้งาน: แปลงข้อมูลจาก EF มาเป็น DTO

3. การเรียงลำดับข้อมูลด้วย OrderBy และ OrderByDescending

การเรียงลำดับเป็นเรื่องที่เลี่ยงไม่ได้เมื่อต้องจัดการกับรายการหรือข้อมูลแบบตาราง

ตัวอย่าง: เรียงลำดับตัวเลขตามลำดับจากน้อยไปมากและจากมากไปน้อย

var ascending = numbers.OrderBy(n => n);
var descending = numbers.OrderByDescending(n => n);

Console.WriteLine(string.Join(", ", ascending)); // ผลลัพธ์: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10

Console.WriteLine(string.Join(", ", descending));
// ผลลัพธ์: 10, 9, 8, 7, 6, 5, 4, 3, 2, 1

👉 กรณีการใช้งาน: การจัดเรียงรายการ แสดงผลว่าใครมีคะแนนสูงสุดน้อยสุด หรือการจัดเรียงผลการค้นหาตามวันที่

4. การหาข้อมูลเจาะจงในคอลเล็กชันด้วย First, FirstOrDefault, Single และ SingleOrDefault

LINQ มีวิธีการดึงข้อมูลแบบเจาะจงจากคอลเล็กชัน

ตัวอย่าง: ดึงเลขคู่ตัวแรกที่เจอ (ถ้าในคอลเล็กชันมีข้อมูลที่ตรงเงื่อนไขตั้งแต่ 1 ขึ้นไป)

var firstEven = numbers.First(n => n % 2 == 0);
Console.WriteLine(firstEven); // ผลลัพธ์: 2

ตัวอย่าง: ดึงเลขคู่ตัวแรกถ้าเจอตามเงื่อนไข ถ้าไม่เจอให้คืนค่าเริ่มต้น

var emptyList = new List<int>();
var firstOrNone = emptyList.FirstOrDefault();
Console.WriteLine(firstOrNone); // ผลลัพธ์: 0 (ค่าเริ่มต้นของ int ถ้าเป็น object จะเป็น null)

👉 กรณีการใช้งาน: ใช้ First() เมื่อรู้ว่ามีข้อมูลแน่ๆ (เพราะถ้าไม่เจอข้อมูลจะเกิด Exception System.InvalidOperationException ถ้าไม่แน่ใจให้ใช้ FirstOrDefault()

⚠️ ความแตกต่างระหว่าง First และ Single

  • First() → คืนค่าข้อมูลที่ตรงกับเงื่อนไขตัวแรกแต่ ไม่ รับประกันว่าไม่ซ้ำกัน
  • Single() → รับประกันว่า มีข้อมูลที่ตรงเงื่อนไขเพียงตัวเดียว ถ้ามีข้อมูลที่ตรงเงื่อนไขมากกว่า 1 ตัวจะเกิด Exception System.InvalidOperationException

5. การสรุปข้อมูลด้วย Count, Sum, Average และ Max

การสรุปข้อมูลมีความจำเป็นสำหรับการรายงานและการวิเคราะห์ ตัวอย่าง: คำนวณผลรวมและค่าเฉลี่ย

var sum = numbers.Sum();
var average = numbers.Average();
var max = numbers.Max();
var count = numbers.Count();

Console.WriteLine($"Sum: {sum}, Average: {average}, Max: {max}, Count: {count}");
// เอาต์พุต: ผลรวม: 55, Average: 5.5, Max: 10, Count: 10

👉 กรณีการใช้งาน: การคำนวณสถิติ การสร้างรายงาน การสรุปข้อมูลชุดใหญ่

6. การลบค่าซ้ำกันด้วย Distinct

Distinct จะดึงเฉพาะข้อมูลที่ไม่ซ้ำกัน

ตัวอย่าง: ลบตัวเลขซ้ำกัน

var duplicateNumbers = new List<int> { 1, 2, 2, 3, 4, 4, 5 };
var uniqueNumbers = duplicateNumbers.Distinct();

Console.WriteLine(string.Join(", ", uniqueNumbers));
// ผลลัพธ์: 1, 2, 3, 4, 5

👉 กรณีการใช้งาน: ใช้เพื่อให้แน่ใจว่าจะไม่มีข้อมูลที่ไม่ซ้ำกัน

7. การจัดกลุ่มข้อมูลด้วย GroupBy

การจัดกลุ่มมีประโยชน์สำหรับการจัดหมวดหมู่และสรุปข้อมูล

ตัวอย่าง: จัดกลุ่มตัวเลขตามเลขคู่/เลขคี่

var groupedNumbers = numbers.GroupBy(n => n % 2 == 0 ? "Even" : "Odd");
foreach (var group in groupedNumbers)
{
    Console.WriteLine($"{group.Key}: {string.Join(", ", group)}");
}
// ผลลัพธ์:
// เลขคี่: 1, 3, 5, 7, 9
// เลขคู่: 2, 4, 6, 8, 10

👉 กรณีการใช้งาน: การแบ่งประเภทยอดขายตามจังหวัด หรือใครขายได้เท่าไร

8. การรวมคอลเล็กชันด้วย Join

ใช้เมื่อเราต้องการรวมคอลเล็กชันที่มีหลายชุดเข้าเป็นชุดเดียว

ตัวอย่าง: รวมพนักงานเข้ากับแผนก

var employees = new[]
{
    new { Id = 1, Name = "ลูฟี่", DepartmentId = 1 },
    new { Id = 2, Name = "นามิ", DepartmentId = 2 },
    new { Id = 3, Name = "โซโล", DepartmentId = 1 }
};

var departments = new[]
{
    new { Id = 1, Name = "บู้" },
    new { Id = 2, Name = "ใช้หัว" }
};

var joined = employees.Join(departments,
    emp => emp.DepartmentId,
    dept => dept.Id, (emp, dept) => new { emp.Name, Department = dept.Name });

foreach (var item in joined)
{
    Console.WriteLine($"{item.Name} works in {item.Department}");
}
// ผลลัพธ์:
// Alice ทำงานฝ่ายทรัพยากรบุคคล
// Bob ทำงานฝ่ายไอที
// Charlie ทำงานฝ่ายทรัพยากรบุคคล

👉 กรณีการใช้งาน: การรวมข้อมูลจากตารางหรือรายการหลายรายการ

9. การทำให้คอลเล็กชันที่ซ้อนกันแบนราบด้วย SelectMany

SelectMany จะทำให้คอลเล็กชันภายในคอลเล็กชันแบนราบ

ตัวอย่าง: แยกคำจากประโยค

var sentences = new List<string>
{
    "สวัสดี C#",
    "LINQ นี่มันดีจริง",
    "C# ยังทำอะไรได้อีกเยอะ"
};
var words = sentences.SelectMany(sentence => sentence.Split(' '));

Console.WriteLine(string.Join(", ", words)); // ผลลัพธ์: สวัสดีโลก LINQ นั้นน่าทึ่ง C# นั้นทรงพลัง

👉 กรณีการใช้งาน: ยุบรวมคอลเล็กชันที่ซ้อนกันให้เหลือแค่คอลเล็กชันเดียว

10. การตรวจสอบข้อมูลด้วย Any และ All

  • Any() ตรวจสอบว่ามีข้อมูล ตัวใดตัวหนึ่ง ตรงตามเงื่อนไขหรือไม่
  • All() ตรวจสอบว่ามีข้อมูล ทั้งหมด ตรงตามเงื่อนไขหรือไม่

ตัวอย่าง: ตรวจสอบเลขคู่

bool hasEven = numbers.Any(n => n % 2 == 0);
Console.WriteLine(hasEven); // ผลลัพธ์: True

ตัวอย่าง: ตรวจสอบว่าตัวเลขทั้งหมดเป็นค่าบวกหรือไม่

bool allPositive = numbers.All(n => n > 0);
Console.WriteLine(allPositive); // ผลลัพธ์: True

👉 กรณีการใช้งาน: การตรวจสอบข้อมูลในคอลเล็กชันโดยที่ไม่ต้องดึงข้อมูล

ข้อสรุป

ด้วยการใช้ LINQ เหล่านี้ การเขียนโค้ด C# ที่สะอาดขึ้น มีประสิทธิภาพมากขึ้น และบำรุงรักษาได้ง่ายขึ้น 🚀

เขียนโค้ดให้สนุกนะครับ 😊