Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C#

Interface IStructuralComparable ใน C#

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.Default)); // 0
Console.WriteLine(sc.CompareTo(t3, Comparer.Default)); // -1 (String Compare: "A" < "B")


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วัตถุประสงค์เมธอด
IStructuralEquatableEquality (Equals/HashCode)Equals, GetHashCode
IStructuralComparableOrdering (Sort/Compare)CompareTo

ใช้เมื่อไหร่

  • Sorting Arrays/Tuples ด้วย Custom Comparer
  • ใช้เป็น Key ใน SortedDictionary/SortedSet ที่ต้องการ Structural Ordering
  • Implement เองใน Custom Collection Class