Aug 3 2008

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

Category: .NETm3rLinEz @ 02:17

โพสต์นี้จะพูดเรื่องการใช้ 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 หายห่วงเรื่องความเร็ว

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

Tags:

Comments

1.
007 007 says:

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));

2.
KittyDoll KittyDoll says:

นายคะ เราอยากทำ OX แต่เราไม่ค่อยเข้าใจโค้ดที่นายเขียนเลยง่ะ
แบบว่าเราอยากเขียนแบบตาราง 5*5 อ่ะ นายพอจะช่วยสอนเราได้มั้ย
นายพอจะช่วยติดต่อเรามาหน่อยได้มั้ย
ขอรบกวนหน่อยน๊า >//////<

Add comment


(Will show your Gravatar icon)

biuquote
  • Comment
  • Preview
Loading