0Pricing
C# Academy · บทเรียน

WHERE และการกรอง

เลือกองค์ประกอบที่ตรงเงื่อนไข

WHERE และการกรอง เป็นบทเรียน C# Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน C# Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส C# Academy มีบทเรียนทั้งหมด 4 บทเรียน

Where ทำอะไร

Where เป็นตัวดำเนินการหลักสำหรับกรองข้อมูลของ LINQ โดยรับเพรดิเคต ซึ่งเป็นฟังก์ชันที่คืนค่า bool และส่งคืนเฉพาะสมาชิกที่ตรงตามเงื่อนไขนั้น

Where อยู่ใน System.Linq และทำงานกับ IEnumerable<T> ใดก็ได้ โดยส่งคืนลำดับใหม่แทนการแก้ไขแหล่งข้อมูลเดิม

using System;
using System.Linq;
using System.Collections.Generic;

var nums = new List<int> { 1, 2, 3, 4, 5, 6 };
var evens = nums.Where(n => n % 2 == 0);
Console.WriteLine(string.Join(", ", evens));

แลมบ์ดาเพรดิเคต

อาร์กิวเมนต์ของ Where คือแลมบ์ดา n => condition พารามิเตอร์แทนสมาชิกแต่ละตัว และส่วนเนื้อหาต้องประเมินค่าเป็น true หรือ false

การคืนค่า true จะเก็บสมาชิกนั้นไว้ ส่วน false จะตัดสมาชิกนั้นออก นิพจน์บูลีนใด ๆ ก็ใช้ได้

using System;
using System.Linq;

string[] words = { "apple", "fig", "banana", "kiwi" };
var shortWords = words.Where(w => w.Length <= 4);
Console.WriteLine(string.Join(", ", shortWords));

รูปแบบไวยากรณ์การสอบถาม

LINQ มีไวยากรณ์การสอบถามที่อ่านคล้าย SQL ส่วนคำสั่ง where ใช้กรองข้อมูล และ select ใช้ฉายข้อมูล

ไวยากรณ์นี้จะถูกคอมไพล์เป็นการเรียกใช้เมธอดชุดเดียวกัน ดังนั้น from x in src where ... select x จึงเหมือนกับ src.Where(...) เลือกใช้รูปแบบที่อ่านเข้าใจง่ายกว่าได้เลย

using System;
using System.Linq;

int[] scores = { 40, 75, 90, 55, 88 };
var passing = from s in scores
              where s >= 60
              select s;
Console.WriteLine(string.Join(", ", passing));

การรวมเงื่อนไข

ภายในเพรดิเคตเดียว คุณสามารถรวมการตรวจสอบหลายอย่างด้วย && และ || ซึ่งช่วยให้การกรองที่เกี่ยวข้องกันเกิดขึ้นในรอบเดียว

วงเล็บช่วยให้อ่านง่ายขึ้นเมื่อผสมตัวดำเนินการ เช่นเดียวกับนิพจน์บูลีนทั่วไป

using System;
using System.Linq;
using System.Collections.Generic;

var ages = new List<int> { 12, 17, 21, 35, 64, 70 };
var adults = ages.Where(a => a >= 18 && a < 65);
Console.WriteLine(string.Join(", ", adults));

การต่อการเรียกใช้ Where

คุณสามารถต่อการเรียกใช้ Where หลายครั้งได้ แต่ละครั้งจะกรองผลลัพธ์จากครั้งก่อนหน้า ดังนั้นเงื่อนไขทั้งหมดจึงรวมกันด้วยตรรกะ AND

บางครั้งการต่อกันอ่านเข้าใจง่ายกว่าการใช้เพรดิเคตขนาดใหญ่เพียงตัวเดียว และยังช่วยให้คุณประกอบตัวกรองที่สร้างจากส่วนต่าง ๆ ได้

using System;
using System.Linq;

int[] data = { 3, 8, 15, 22, 27, 40 };
var result = data.Where(n => n > 5)
                 .Where(n => n % 2 == 0);
Console.WriteLine(string.Join(", ", result));

Where พร้อมดัชนี

รูปแบบการเรียกใช้หนึ่งของ Where จะแสดงดัชนีที่เริ่มนับจากศูนย์ของสมาชิกเป็นพารามิเตอร์ตัวที่สองของแลมบ์ดา ซึ่งเหมาะสำหรับการกรองตามตำแหน่ง

คุณสามารถใช้วิธีนี้เพื่อเก็บสมาชิกทุก ๆ สองตัว หรือข้ามสมาชิกตัวแรกโดยดูจากดัชนี

using System;
using System.Linq;

string[] items = { "a", "b", "c", "d", "e" };
var evenIdx = items.Where((val, idx) => idx % 2 == 0);
Console.WriteLine(string.Join(", ", evenIdx));

การกรองออบเจ็กต์

การกรองมีประโยชน์อย่างมากกับคอลเลกชันของออบเจ็กต์ เพรดิเคตสามารถอ่านคุณสมบัติใด ๆ ของสมาชิกแต่ละตัวได้

นี่คือวิธีเขียนกฎทางธุรกิจ เช่น “ลูกค้าในเมืองนี้” หรือ “คำสั่งซื้อที่สูงกว่าเกณฑ์” ในรูปแบบที่บอกสิ่งที่ต้องการอย่างชัดเจน

using System;
using System.Linq;
using System.Collections.Generic;

record Product(string Name, decimal Price);
var list = new List<Product> {
  new("Pen", 1.5m), new("Lamp", 20m), new("Mug", 8m) };
var cheap = list.Where(p => p.Price < 10);
foreach (var p in cheap) Console.WriteLine(p.Name);

การประมวลผลแบบเลื่อนเวลา

Where ใช้การประมวลผลแบบเลื่อนเวลา กล่าวคือจะไม่ทำงานเมื่อมีการกำหนด แต่จะทำงานเมื่อมีการวนอ่านลำดับ เช่น ใน foreach หรือเมื่อเรียกใช้ ToList

ดังนั้น หากแหล่งข้อมูลมีการเปลี่ยนแปลงก่อนเริ่มวนอ่าน การเปลี่ยนแปลงนั้นจะปรากฏในผลลัพธ์

using System;
using System.Linq;
using System.Collections.Generic;

var src = new List<int> { 1, 2 };
var q = src.Where(n => n > 1);
src.Add(5);
Console.WriteLine(string.Join(", ", q));

ต้นทุนการประเมินซ้ำ

เนื่องจากการกรองถูกเลื่อนเวลา การวนอ่านคำสอบถามเดิมสองครั้งจะเรียกใช้เพรดิเคตซ้ำสองครั้ง สำหรับเพรดิเคตที่ใช้เวลานานหรือแหล่งข้อมูลที่เปลี่ยนแปลงอยู่เสมอ พฤติกรรมนี้อาจทำให้คุณประหลาดใจได้

เมื่อจำเป็นต้องใช้ภาพข้อมูลที่คงที่และนำกลับมาใช้ซ้ำได้ ให้สร้างผลลัพธ์เป็นรูปธรรมเพียงครั้งเดียวด้วย ToList ซึ่งเราจะกล่าวถึงในภายหลังของหลักสูตรนี้

using System;
using System.Linq;

int calls = 0;
int[] nums = { 1, 2, 3 };
var q = nums.Where(n => { calls++; return n > 1; });
foreach (var _ in q) { }
foreach (var _ in q) { }
Console.WriteLine(calls);

กรองแล้วนับ

รูปแบบที่ใช้บ่อยคือกรองข้อมูลแล้วถามว่ามีข้อมูลที่ตรงกันกี่รายการ Count สามารถรับเพรดิเคตได้โดยตรง จึงรวมการกรองและการนับไว้ด้วยกัน

count.Count(p => cond) มีความหมายเทียบเท่ากับ seq.Where(p => cond).Count() แต่เขียนได้กระชับกว่า

using System;
using System.Linq;

int[] grades = { 55, 80, 42, 91, 67 };
int passed = grades.Count(g => g >= 60);
Console.WriteLine($"Passed: {passed}");

ผลลัพธ์ว่างไม่ใช่ปัญหา

หากไม่มีสมาชิกใดตรงตามเพรดิเคต Where จะส่งคืนลำดับว่างเท่านั้น ไม่เคยส่งคืน null

จึงสามารถต่อการกรองได้อย่างปลอดภัย ผลลัพธ์ว่างจะไหลผ่านตัวดำเนินการถัดไปได้โดยไม่ต้องจัดการเป็นกรณีพิเศษ

using System;
using System.Linq;

int[] nums = { 1, 2, 3 };
var big = nums.Where(n => n > 100);
Console.WriteLine($"Count: {big.Count()}");

ตรวจสอบความเข้าใจอย่างรวดเร็ว

ทดสอบความเข้าใจเกี่ยวกับการประมวลผลแบบเลื่อนเวลา

ทบทวน

Where กรองลำดับด้วยเพรดิเคตบูลีนและส่งคืน IEnumerable ใหม่ มีรูปแบบการเรียกใช้ที่รับดัชนี สามารถต่อกันหรือรวมกับ &&/|| ได้ และทำงานกับออบเจ็กต์ผ่านคุณสมบัติของออบเจ็กต์

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

คำถามที่พบบ่อย

บทเรียน “WHERE และการกรอง” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “WHERE และการกรอง” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส C# Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส C# Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “WHERE และการกรอง”

เลือกองค์ประกอบที่ตรงเงื่อนไข คุณปฏิบัติ C# Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน C# Academy หรือไม่

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

บทเรียน “WHERE และการกรอง” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน C# Academy นี้ได้ไหม

ได้ บทเรียน C# Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. WHERE และการกรอง
  2. SELECT และการฉายข้อมูล
  3. OrderBy และการจัดกลุ่ม
  4. การรวมค่าและ ToList
← กลับไปที่ C# Academy