試煉26 - 自訂物件 技巧2 怎麼比大小

2022 鐵人賽文 搬回點部落

開始試煉

自訂class 怎麼比大小
首先 先來自訂class

void Main()
{
    var list = new List<Student>()
    {
        new Student{Name="A",Age=34},
        new Student{Name="B",Age=30},
        new Student{Name="C",Age=10},
    };
    list.Sort();
    list.Dump();
}
class Student
{
    public string Name { get; set; }
    public int Age { get; set; }
}


可以看到出例外了 因為沒有說怎麼比大小

實做 IComparable<T>

void Main()
{
    var list = new List<Student>()
    {
        new Student{Name="A",Age=34},
        new Student{Name="B",Age=30},
        new Student{Name="C",Age=10},
    };
    list.Sort();
    list.Dump();
}
class Student : IComparable<Student>
{
    public string Name { get; set; }
    public int Age { get; set; }

    public int CompareTo(Student student)
    {
        if (Age > student.Age)
        {
            return 1;
        }
        if (Age < student.Age)
        {
            return -1;
        }
        return 0;
    }
}


.net 比較大小有用大於0 小於0 等於0
所以得到 由小到大排序
那如果要大到小呢
另一種方法實做IComparer<Student>

void Main()
{
    var list = new List<Student>()
    {
        new Student{Name="A",Age=34},
        new Student{Name="B",Age=30},
        new Student{Name="C",Age=10},
    };
    list.Sort(new StudentComparer());
    list.Dump();
}
class StudentComparer : IComparer<Student>
{
    public int Compare(Student x, Student y)
    {
        if (y.Age > x.Age)
        {
            return 1;
        }
        if (y.Age < x.Age)
        {
            return -1;
        }
        return 0;
    }
}


這樣就可以大到小排序
重點就是去控制 回傳 1 -1

結束試煉

雖然簡單的排序 用LINQ OrderBy 就可以處理 但是遇到複雜需求時
還是知道一下 IComparable , IComparer 比較踏實

如果內容有誤請多鞭策謝謝