โพสต์นี้จะพูดเรื่องการใช้ 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 หายห่วงเรื่องความเร็ว
คงเป็นประโยชน์นะครับ :)
33cfe950-1422-4ba4-9caf-04fd3b6dcb55|1|5.0
.NET
c#