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

OrderBy และการจัดกลุ่ม

เรียงลำดับและจัดกลุ่มผลลัพธ์

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

การเรียงลำดับด้วย OrderBy

OrderBy เรียงลำดับลำดับข้อมูลจากน้อยไปมากตามคีย์ที่คุณเลือก แลมบ์ดาจะคืนค่าที่ใช้เรียงลำดับ

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

using System;
using System.Linq;

int[] nums = { 4, 1, 3, 2 };
var sorted = nums.OrderBy(n => n);
Console.WriteLine(string.Join(", ", sorted));

ลำดับจากมากไปน้อย

OrderByDescending เรียงลำดับจากค่ามากไปหาค่าน้อยตามคีย์ที่เลือก

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

using System;
using System.Linq;

int[] scores = { 70, 95, 60, 88 };
var ranked = scores.OrderByDescending(s => s);
Console.WriteLine(string.Join(", ", ranked));

การเรียงลำดับตามคุณสมบัติ

สำหรับออบเจ็กต์ ให้เลือกคุณสมบัติที่จะใช้เรียงลำดับ OrderBy(p => p.Age) จะเรียงบุคคลจากอายุน้อยไปหาอายุมาก

คีย์อาจเป็นชนิดใดก็ได้ที่เปรียบเทียบได้ เช่น ตัวเลข สตริง วันที่ หรือชนิดใด ๆ ที่ใช้งาน IComparable

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

record P(string Name, int Age);
var people = new List<P> { new("Ana", 30), new("Bo", 22) };
var byAge = people.OrderBy(p => p.Age);
foreach (var p in byAge) Console.WriteLine(p.Name);

การเรียงลำดับรองด้วย ThenBy

ThenBy เพิ่มเกณฑ์ตัดสินเมื่อค่าเท่ากัน หลังจากใช้ OrderBy จะเรียงองค์ประกอบที่มีคีย์หลักเดียวกันด้วยคีย์ที่สอง

คุณสามารถเรียกใช้ ThenBy/ThenByDescending ต่อกันหลายครั้งเพื่อจัดลำดับหลายระดับได้

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

record P(string Name, int Age);
var people = new List<P> { new("Bo", 30), new("Ana", 30), new("Cy", 22) };
var ordered = people.OrderBy(p => p.Age).ThenBy(p => p.Name);
foreach (var p in ordered) Console.WriteLine($"{p.Age} {p.Name}");

เหตุใดจึงไม่ใช้ OrderBy ครั้งที่สอง

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

สำหรับการเรียงลำดับเป็นชั้น ให้ใช้ ThenBy หลังจาก OrderBy ครั้งแรกเสมอ

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

record P(string N, int A);
var ps = new List<P> { new("Bo", 30), new("Ana", 30) };
var wrong = ps.OrderBy(p => p.A).OrderBy(p => p.N);
foreach (var p in wrong) Console.WriteLine(p.N);

ไวยากรณ์การสืบค้นแบบเรียงลำดับ

ไวยากรณ์การสืบค้นมีอนุประโยค orderby คุณสามารถระบุคีย์หลายรายการโดยคั่นด้วยจุลภาค และอาจใส่ descending ได้

orderby p.Age, p.Name descending จะเรียงตามอายุ แล้วเรียงตามชื่อย้อนกลับสำหรับรายการที่อายุเท่ากัน

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

record P(string N, int A);
var ps = new List<P> { new("Bo", 30), new("Ana", 30), new("Cy", 22) };
var q = from p in ps orderby p.A, p.N select p.N;
Console.WriteLine(string.Join(", ", q));

การจัดกลุ่มด้วย GroupBy

GroupBy แบ่งลำดับข้อมูลออกเป็นกลุ่มที่มีคีย์ร่วมกัน โดยส่งกลับลำดับข้อมูลของ IGrouping<TKey, TElement>

การจัดกลุ่มแต่ละกลุ่มจะแสดง Key ของกลุ่ม และตัวมันเองสามารถวนซ้ำเพื่ออ่านองค์ประกอบในกลุ่มนั้นได้

using System;
using System.Linq;

int[] nums = { 1, 2, 3, 4, 5, 6 };
var groups = nums.GroupBy(n => n % 2 == 0 ? "even" : "odd");
foreach (var g in groups)
  Console.WriteLine($"{g.Key}: {string.Join(\",\", g)}");

คีย์และสมาชิกของกลุ่ม

Key ของแต่ละกลุ่มใช้ระบุส่วนที่แบ่งไว้ และการวนซ้ำกลุ่มจะส่งคืนสมาชิกของกลุ่มนั้น คุณสามารถเรียก Count() กับกลุ่มได้โดยตรง

วิธีนี้ใช้สร้างฮิสโตแกรม ยอดนับ และการแจกแจงข้อมูลตามหมวดหมู่

using System;
using System.Linq;

string[] fruit = { "apple", "avocado", "banana", "cherry" };
var byLetter = fruit.GroupBy(f => f[0]);
foreach (var g in byLetter)
  Console.WriteLine($"{g.Key}: {g.Count()}");

จัดกลุ่มแล้วสร้างผลลัพธ์

รูปแบบที่ใช้กันทั่วไปคือการสร้างวัตถุสรุปจากแต่ละกลุ่มด้วย Select หลังจาก GroupBy

คุณอ่านค่า Key แล้วรวมสมาชิก เช่น นับจำนวนหรือหาผลรวมของแต่ละกลุ่ม

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

record Sale(string City, int Amt);
var sales = new List<Sale> { new("NY", 5), new("LA", 3), new("NY", 2) };
var totals = sales.GroupBy(s => s.City)
                  .Select(g => new { g.Key, Sum = g.Sum(x => x.Amt) });
foreach (var t in totals) Console.WriteLine($"{t.Key}={t.Sum}");

GroupBy พร้อมตัวเลือกองค์ประกอบ

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

ในที่นี้ เราจัดกลุ่มตามเมือง แต่เก็บไว้เฉพาะจำนวนเงิน

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

record Sale(string City, int Amt);
var sales = new List<Sale> { new("NY", 5), new("NY", 2) };
var g = sales.GroupBy(s => s.City, s => s.Amt);
foreach (var grp in g)
  Console.WriteLine($"{grp.Key}: {string.Join(\",\", grp)}");

การเรียงลำดับและการจัดกลุ่มทำงานแบบเลื่อนเวลา

ทั้ง OrderBy และ GroupBy ใช้การทำงานแบบเลื่อนเวลา ซึ่งจะทำงานเมื่อมีการวนอ่านข้อมูล แต่โปรดทราบว่าการเรียงลำดับและการจัดกลุ่มต้องอ่านแหล่งข้อมูลทั้งหมดก่อนจึงจะสร้างองค์ประกอบแรกได้

ดังนั้น ต่างจาก Where การทำงานเหล่านี้ไม่ได้ประมวลผลทีละส่วน แต่ต้นทุนการทำงานจะเกิดขึ้นตั้งแต่การวนอ่านครั้งแรก

using System;
using System.Linq;

int[] nums = { 3, 1, 2 };
var q = nums.OrderBy(n => n);
Console.WriteLine("Query built");
Console.WriteLine(string.Join(", ", q));

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

ลองนึกถึงการเรียงลำดับหลายระดับ

สรุปทบทวน

OrderBy/OrderByDescending เรียงลำดับตามคีย์ ส่วน ThenBy เพิ่มเกณฑ์ตัดสินเมื่อค่าเท่ากัน การใช้ OrderBy ครั้งที่สองจะเรียงลำดับใหม่ จึงไม่ใช่เกณฑ์ตัดสินเมื่อค่าเท่ากัน

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

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

บทเรียน “OrderBy และการจัดกลุ่ม” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “OrderBy และการจัดกลุ่ม”

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

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

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

บทเรียน “OrderBy และการจัดกลุ่ม” ใช้เวลานานแค่ไหน

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

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

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

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

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