iT邦幫忙

2022 iThome 鐵人賽

DAY 26
0
Software Development

離開C#新手村的最後試煉系列 第 26

# 試煉26 - 自訂 class 技巧2 怎麼比大小

  • 分享至 

  • xImage
  •  

開始試煉

自訂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 比較踏實


上一篇
# 試煉25 - 自訂 class 技巧1 怎麼算相等
下一篇
# 試煉27 - 自訂 class 技巧3 怎麼算加減乘除
系列文
離開C#新手村的最後試煉30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言