วิธีการสร้างรายชื่อชื่อที่แตกต่างและเรียงลำดับจาก DataTable ด้วย LINQ

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

ปัญหา

คุณมี DataTable ที่มีคอลัมน์สำหรับชื่อและคุณต้องการดึงกลุ่มชื่อที่ไม่ซ้ำกันซึ่งเรียงลำดับตามตัวอักษร คำสั่ง LINQ แบบปกติมีลักษณะดังนี้:

var names =
    (from DataRow dr in dataTable.Rows
    orderby (string)dr["Name"]
    select (string)dr["Name"]).Distinct();

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

เข้าใจปัญหา

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

เหตุผลที่การจัดเรียงอาจไม่ทำงาน

  • เมธอด Distinct() อาจไม่รักษาลำดับที่กำหนดโดย orderby เมื่อมันประมวลผลข้อมูล มันจะมุ่งเน้นเฉพาะค่าที่ไม่ซ้ำกันโดยไม่คำนึงถึงลำดับ

เพื่อให้ได้ทั้งลักษณะเฉพาะและลำดับ เราจำเป็นต้องปรับแนวทาง LINQ ของเรา

การแก้ปัญหาที่มีโครงสร้าง

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

ขั้นตอนที่ 1: เลือกชื่อไปยังรายการใหม่

ขั้นแรก รวมชื่อทั้งหมดไว้ในกลุ่ม คุณอาจทำการคัดลอกในระหว่างขั้นตอนนี้หากจำเป็น

var x1 = 
    (from DataRow dr in dataTable.Rows
    select (string)dr["Name"]).ToList();

ขั้นตอนที่ 2: สร้างรายการที่ไม่ซ้ำกัน

ถัดไป สร้างรายการที่ไม่ซ้ำจากกลุ่มที่ได้รับในขั้นตอนที่ 1 ขั้นตอนนี้จะกรองข้อมูลที่ซ้ำกันออก

var x2 = x1.Distinct().ToList();

ขั้นตอนที่ 3: สร้างรายการที่เรียงลำดับ

สุดท้าย ให้นำรายชื่อที่ไม่ซ้ำกันไปจัดเรียงตามลำดับตัวอักษร

var orderedNames = x2.OrderBy(name => name).ToList();

ตัวอย่างโค้ดทั้งหมด

นี่คือภาพรวมของโค้ดทั้งหมดเมื่อเก็บรวมเข้าด้วยกัน:

var x1 = 
    (from DataRow dr in dataTable.Rows
    select (string)dr["Name"]).ToList();

var x2 = x1.Distinct().ToList();

var orderedNames = x2.OrderBy(name => name).ToList();

สรุป

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

แนวทางที่มีโครงสร้างนี้ช่วยให้คุณดึงชื่อที่ไม่ซ้ำกันในลำดับที่คุณต้องการ ทำให้เป็นวิธีการที่เชื่อถือได้ในโปรเจ็กต์การพัฒนา C# ของคุณ

อย่าลังเลที่จะลองใช้วิธีนี้และดูว่าเหมาะกับความต้องการข้อมูลของคุณอย่างไร!