Interface IStructuralComparable ใน C#
IStructuralComparable รองรับการเปรียบเทียบโครงสร้าง (Structural Comparison) ของ Collection Objects (Array, Tuple) คือเปรียบเทียบ Element ตามลำดับ ไม่ใช่ Reference
เมธอดเดียว
int CompareTo(object other, IComparer comparer);
คืนค่า: < 0 (น้อยกว่า), 0 (เท่ากัน), > 0 (มากกว่า) ตาม Sort Order
โครงสร้างที่ Implement อยู่แล้ว
- Array (ทุกประเภท)
- Generic Tuple Classes (
Tuple<T1>,Tuple<T1,T2>, ...) - ValueTuple (C# 7+) - ใช้ Structural Comparison โดย Default
ตัวอย่าง: เปรียบเทียบ Array
using System;
using System.Collections;
class Program
{
static void Main()
{
int[] arr1 = { 1, 2, 3 };
int[] arr2 = { 1, 2, 3 };
int[] arr3 = { 1, 2, 4 };
IStructuralComparable sc1 = arr1;
Console.WriteLine($"arr1 vs arr2: {sc1.CompareTo(arr2, Comparer.Default)}"); // 0 (Equal)
Console.WriteLine($"arr1 vs arr3: {sc1.CompareTo(arr3, Comparer.Default)}"); // -1 (Less)
Console.WriteLine($"arr3 vs arr1: {((IStructuralComparable)arr3).CompareTo(arr1, Comparer.Default)}"); // 1 (Greater)
}
}
ผลลัพธ์
arr1 vs arr2: 0
arr1 vs arr3: -1
arr3 vs arr1: 1
ตัวอย่าง: Tuple Comparison
var t1 = Tuple.Create(1, "A", 10);
var t2 = Tuple.Create(1, "A", 10);
var t3 = Tuple.Create(1, "B", 5);
IStructuralComparable sc = t1;
Console.WriteLine(sc.CompareTo(t2, Comparer
Custom Comparer
// Descending Order Comparer
class DescComparer : IComparer
{
public int Compare(int x, int y) => y.CompareTo(x); // Reverse
}
// ใช้งาน
int[] a = { 3, 2, 1 };
int[] b = { 3, 2, 1 };
var sc = (IStructuralComparable)a;
Console.WriteLine(sc.CompareTo(b, new DescComparer())); // 0 (Equal in Descending too)
ความแตกต่าง IStructuralEquatable vs IStructuralComparable
| Interface | วัตถุประสงค์ | เมธอด |
|---|---|---|
IStructuralEquatable | Equality (Equals/HashCode) | Equals, GetHashCode |
IStructuralComparable | Ordering (Sort/Compare) | CompareTo |
ใช้เมื่อไหร่
- Sorting Arrays/Tuples ด้วย Custom Comparer
- ใช้เป็น Key ใน SortedDictionary/SortedSet ที่ต้องการ Structural Ordering
- Implement เองใน Custom Collection Class