Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C#

Phương thức Double.CompareTo() trong C# với các ví dụ

Giới thiệu

Phương thức Double.CompareTo() trong C# so sánh thể hiện hiện tại với một object hoặc Double được chỉ định, trả về số nguyên chỉ ra giá trị của thể hiện này nhỏ hơn, bằng, hay lớn hơn giá trị được so sánh.

Cú pháp

public int CompareTo (double val);
public int CompareTo (object val);
  • Cú pháp 1: val là số thực double-precision để so sánh.
  • Cú pháp 2: val là object để so sánh (phải là double hoặc null).

Giá trị trả về

Giá trịÝ nghĩa
< 0Thể hiện hiện tại nhỏ hơn val
= 0Thể hiện hiện tại bằng val
> 0Thể hiện hiện tại lớn hơn val

Ví dụ 1: So sánh hai double bằng nhau

using System;

public class Demo {
    public static void Main() {
        double d1 = 150d;
        double d2 = 150d;

        Console.WriteLine("Double1 Value = " + d1);
        Console.WriteLine("Double2 Value = " + d2);
        Console.WriteLine("Kết quả so sánh (CompareTo) = " + d1.CompareTo(d2));
    }
}

Đầu ra ví dụ 1

Double1 Value = 150
Double2 Value = 150
Kết quả so sánh (CompareTo) = 0

Ví dụ 2: So sánh double với object

using System;

public class Demo {
    public static void Main() {
        double d1 = 20d;
        object d2 = 20d; // Boxing

        Console.WriteLine("Double1 Value = " + d1);
        Console.WriteLine("Double2 Value = " + d2);
        Console.WriteLine("Kết quả so sánh (CompareTo) = " + d1.CompareTo(d2));
    }
}

Đầu ra ví dụ 2

Double1 Value = 20
Double2 Value = 20
Kết quả so sánh (CompareTo) = 0

Ví dụ mở rộng: Các trường hợp so sánh

using System;

public class Demo {
    public static void Main() {
        double[] values = { 10.5, -5.0, 0.0, double.NaN, double.PositiveInfinity, double.NegativeInfinity };
        double reference = 0.0;

        foreach (double v in values) {
            int cmp = v.CompareTo(reference);
            string relation = cmp < 0 ? "nhỏ hơn" : (cmp > 0 ? "lớn hơn" : "bằng");
            Console.WriteLine($"{v,15} so với 0.0: {cmp,3} ({relation})");
        }

        // So sánh với NaN
        Console.WriteLine("\nSo sánh với NaN:");
        Console.WriteLine("NaN.CompareTo(NaN) = " + double.NaN.CompareTo(double.NaN)); // 0 (bằng nhau theo CompareTo)
        Console.WriteLine("NaN.CompareTo(1.0) = " + double.NaN.CompareTo(1.0));         // -1 (NaN coi như nhỏ hơn mọi số)
        Console.WriteLine("1.0.CompareTo(NaN) = " + 1.0.CompareTo(double.NaN));         // 1 (mọi số lớn hơn NaN)
    }
}

Đầu ra mở rộng

          10.5 so với 0.0:   1 (lớn hơn)
          -5.0 so với 0.0:  -1 (nhỏ hơn)
           0.0 so với 0.0:   0 (bằng)
           NaN so với 0.0:  -1 (nhỏ hơn)
           ∞ so với 0.0:    1 (lớn hơn)
          -∞ so với 0.0:   -1 (nhỏ hơn)

So sánh với NaN:
NaN.CompareTo(NaN) = 0
NaN.CompareTo(1.0) = -1
1.0.CompareTo(NaN) = 1

Lưu ý quan trọng

  • CompareTo triển khai IComparable và IComparable<double>.
  • Khác với Equals, CompareTo cho phép sắp xếp (sorting).
  • Quy tắc so sánh NaN: NaN.CompareTo(NaN) = 0, NaN.CompareTo(any number) = -1, any number.CompareTo(NaN) = 1. Điều này đảm bảo NaN được sắp xếp ở đầu.
  • Nếu val là object không phải double (và không null), ném ArgumentException.
  • Với object val = null, trả về 1 (mọi instance lớn hơn null).

Ứng dụng

  • Sắp xếp mảng/List double: Array.Sort(arr) dùng CompareTo nội bộ.
  • Binary search, tree-based structures (SortedSet, SortedDictionary).
  • Logic điều khiển dựa trên ngưỡng (threshold comparison).