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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- WHERE และการกรอง
- SELECT และการฉายข้อมูล
- OrderBy และการจัดกลุ่ม
- การรวมค่าและ ToList