การเรียงลำดับอาเรย์ของคลาสใดๆใน C#

3. August 2008

โพสต์นี้จะพูดเรื่องการใช้ Array.Sort สำหรับการ Sort Class ใดๆใน C# นะครับ ปกติถ้าเรามีคลาสอะไรก็ตามที่อยากจัดเรียง เราอาจทำการ imeplement interface ที่ชื่อว่า IComparable ให้กับคลาสนั้น แล้วสั่ง Array.Sort(arr) ก็จะได้ลำดับตามที่วิธีการเรียงที่ implement ไว้

แล้วถ้าอยากเรียงโดยใช้วิธีเรียงหลายๆแบบล่ะ ? เช่น ถ้ามีจุดใน 3D space ประกอบด้วย X, Y, Z

  • เรียงตามค่า X
  • เรียงตามค่า Y
  • เรียงตามค่า Z

สมมติว่ามีคลาส Pnt เก็บจุดใดๆใน space

class Pnt {

public long X { get; set; }

public long Y { get; set; }

public long Z { get; set; }

public Pnt(long x, long y, long z) { X = x; Y = y; Z = z; }

}

ถ้าอยากเรียงตามค่า X ก็ใช้ anonymous delegate ที่ทำหน้า sort ดังนี้

Array.Sort(arr, delegate(Pnt a, Pnt b) {

return a.X.CompareTo(b.X);

} );

ส่วนถ้าอยากเรียงตามค่า Y

Array.Sort(arr, delegate(Pnt a, Pnt b) {

return a.Y.CompareTo(b.Y);

} );

ค่าที่ return ไปต้องเป็นจำนวนเต็มนะครับ

  • ถ้า return + หมายถึง a > b
  • ถ้า return - หมายถึง a < b
  • ถ้า return 0 หมายถึง a == b

จากการอ่านเอกสารใน MSDN Library (ขี้เกียดทำลิงค์) เค้าบอกว่าอัลกอริธึมที่ใช้ทำงานใน O(n log n) เท่ากับพวก Quick sort และ Merge sort หายห่วงเรื่องความเร็ว

คงเป็นประโยชน์นะครับ :)

.NET

Comments

007
007
8/3/2008 12:09:37 PM #
you can just use lambdas for that too. Make for shorter and more elegant code.

Array.Sort(arr, (a, b) => a.X.CompareTo(b.X));
KittyDoll
KittyDoll
8/28/2008 11:22:57 AM #
นายคะ เราอยากทำ OX แต่เราไม่ค่อยเข้าใจโค้ดที่นายเขียนเลยง่ะ
แบบว่าเราอยากเขียนแบบตาราง 5*5 อ่ะ นายพอจะช่วยสอนเราได้มั้ย
นายพอจะช่วยติดต่อเรามาหน่อยได้มั้ย
ขอรบกวนหน่อยน๊า >//////<
Comments are closed