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

การรวมค่าและ ToList

นับ รวม และแปลงเป็นรายการ

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

การนับองค์ประกอบ

Count ส่งกลับจำนวนองค์ประกอบในลำดับข้อมูล หากระบุเงื่อนไข จะนับเฉพาะองค์ประกอบที่ตรงตามเงื่อนไข

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

using System;
using System.Linq;

int[] nums = { 1, 2, 3, 4, 5 };
Console.WriteLine(nums.Count());
Console.WriteLine(nums.Count(n => n > 2));

การหาผลรวมของค่า

Sum บวกค่าตัวเลขเข้าด้วยกัน สำหรับลำดับข้อมูลตัวเลข จะหาผลรวมขององค์ประกอบต่าง ๆ และหากมีตัวเลือก ก็จะหาผลรวมของค่าที่สร้างจากแต่ละองค์ประกอบ

ผลลัพธ์จะมีชนิดตัวเลขเดียวกับแหล่งข้อมูลหรือผลลัพธ์จากตัวเลือก

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

record Order(int Qty, decimal Price);
var orders = new List<Order> { new(2, 5m), new(3, 4m) };
decimal total = orders.Sum(o => o.Qty * o.Price);
Console.WriteLine(total);

การหาค่าเฉลี่ย

Average คำนวณค่าเฉลี่ยเลขคณิต เช่นเดียวกับ Sum ตรงที่รับตัวเลือกเพิ่มเติมได้

ผลลัพธ์เป็นชนิดเลขทศนิยม เช่น double แม้แหล่งข้อมูลจะเป็นจำนวนเต็ม เพื่อไม่ให้ความแม่นยำสูญหายระหว่างการหาร

using System;
using System.Linq;

int[] scores = { 80, 90, 100 };
double avg = scores.Average();
Console.WriteLine(avg);

ค่าต่ำสุดและค่าสูงสุด

Min และ Max ส่งกลับค่าที่น้อยที่สุดและมากที่สุด หากมีตัวเลือก ก็จะลดข้อมูลให้เหลือคีย์ที่สร้างขึ้น

ใน .NET รุ่นใหม่ MaxBy และ MinBy จะส่งกลับองค์ประกอบทั้งหมดที่มีคีย์สูงสุดหรือต่ำสุด ไม่ใช่เพียงค่าคีย์

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

record P(string Name, int Age);
var ps = new List<P> { new("Ana", 30), new("Bo", 22) };
var oldest = ps.MaxBy(p => p.Age);
Console.WriteLine(oldest!.Name);

ข้อควรระวังเกี่ยวกับลำดับข้อมูลว่าง

เมื่อลำดับข้อมูลว่าง Average, Min และ Max ที่ทำงานกับชนิดค่า จะโยนข้อผิดพลาด InvalidOperationException ส่วน Sum จะส่งกลับศูนย์ และ Count จะส่งกลับศูนย์

ตรวจสอบด้วย Any() หรือใช้ DefaultIfEmpty ก่อนหาค่าเฉลี่ยของข้อมูลที่อาจว่าง

using System;
using System.Linq;

int[] empty = Array.Empty<int>();
double avg = empty.DefaultIfEmpty(0).Average();
Console.WriteLine(avg);

ใช้ Aggregate สำหรับการรวมแบบกำหนดเอง

Aggregate รวมลำดับข้อมูลให้เหลือค่าเดียวด้วยฟังก์ชันสะสม นี่คือรูปแบบทั่วไปที่อยู่เบื้องหลัง Sum และการดำเนินการอื่น ๆ

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

using System;
using System.Linq;

int[] nums = { 1, 2, 3, 4 };
int product = nums.Aggregate(1, (acc, n) => acc * n);
Console.WriteLine(product);

การสร้างผลลัพธ์จริงด้วย ToList

ToList ทำให้การสืบค้นทำงานทันทีและคัดลอกผลลัพธ์ลงใน List<T> วิธีนี้จะยกเลิกการทำงานแบบเลื่อนเวลาโดยตั้งใจ

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

using System;
using System.Linq;

int[] nums = { 1, 2, 3, 4 };
var evens = nums.Where(n => n % 2 == 0).ToList();
evens.Add(6);
Console.WriteLine(string.Join(", ", evens));

ToArray และ ToDictionary

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

ToDictionary รับตัวเลือกคีย์และอาจรับตัวเลือกค่าเพิ่มเติมด้วย หากองค์ประกอบสองรายการสร้างคีย์เดียวกัน จะโยนข้อผิดพลาด

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

record P(string Name, int Age);
var ps = new List<P> { new("Ana", 30), new("Bo", 22) };
var byName = ps.ToDictionary(p => p.Name, p => p.Age);
Console.WriteLine(byName["Ana"]);

เหตุผลที่ควรสร้างผลลัพธ์จริง

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

การเรียก ToList เพียงครั้งเดียวจะเก็บผลลัพธ์ไว้ ทำให้การอ่านในภายหลังรวดเร็วและได้ผลลัพธ์สอดคล้องกัน

using System;
using System.Linq;

int runs = 0;
int[] nums = { 1, 2, 3 };
var list = nums.Select(n => { runs++; return n; }).ToList();
foreach (var _ in list) { }
foreach (var _ in list) { }
Console.WriteLine(runs);

First, รายการเดียว และ Any

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

Any ใช้บอกว่าลำดับข้อมูลมีองค์ประกอบที่ตรงเงื่อนไขหรือไม่ โดยไม่ต้องนับทั้งหมด

using System;
using System.Linq;

int[] nums = { 3, 8, 5, 12 };
int firstBig = nums.First(n => n > 7);
bool hasOdd = nums.Any(n => n % 2 == 1);
Console.WriteLine($"{firstBig} {hasOdd}");

กระบวนการประมวลผลทั้งหมด

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

อ่านจากบนลงล่าง: กรองก่อน จากนั้นจัดรูปแบบ แล้วเรียงลำดับ และรวบรวมในท้ายที่สุด ToList สุดท้ายจะทำให้กระบวนการประมวลผลทั้งหมดทำงานเพียงครั้งเดียว

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", 9) };
var top = sales.Where(s => s.Amt > 4)
               .OrderByDescending(s => s.Amt)
               .Select(s => s.City)
               .ToList();
Console.WriteLine(string.Join(", ", top));

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

ลองอธิบายการทำงานแบบเลื่อนเวลาและการสร้างผลลัพธ์จริง

สรุปทบทวน

การดำเนินการรวมข้อมูลจะลดลำดับข้อมูลให้เหลือค่าเดียว ได้แก่ Count, Sum, Average, Min/Max, MinBy/MaxBy และ Aggregate ซึ่งเป็นรูปแบบทั่วไป การดำเนินการเหล่านี้บังคับให้เกิดการทำงาน และอาจโยนข้อผิดพลาดเมื่อแหล่งข้อมูลว่าง

ToList, ToArray และ ToDictionary จะสร้างผลลัพธ์จริง ยกเลิกการทำงานแบบเลื่อนเวลา ทำให้กระบวนการประมวลผลที่มีค่าใช้จ่ายสูงทำงานเพียงครั้งเดียว เท่านี้ก็ครบชุดเครื่องมือ LINQ สำหรับการกรองและการสร้างผลลัพธ์แล้ว

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

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

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

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

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

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

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

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

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

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

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

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

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