---
# System prepended metadata

title: OrderBy 使用自訂排序 Compare，Compare 的建立方法
tags: [C#]

---

# OrderBy 使用自訂排序 Compare，Compare 的建立方法
###### tags: `C#`

```
public static void Main()
{
    var allDayOfWeek = Enum.GetValues(typeof(DayOfWeek)).Cast<int>();
    var query2 = allDayOfWeek.OrderBy(i => i);
    Console.WriteLine("預設排序結果: " + string.Join(",", query2) + "\r\n");
    SundayAlwaysOnLast comparer2 = new SundayAlwaysOnLast();
    query2 = allDayOfWeek.OrderBy(i => i, comparer2);
    Console.WriteLine("\r\n自訂排新結果: " + string.Join(",", query2));
}

public class SundayAlwaysOnLast : IComparer<int>
{
    // Compare
    // 小於零 = x 小於 y
    // 零 = x 等於 y
    // 大於零 = x 大於 y
    public int Compare(int s1, int s2)
    {
        // 等於不動
        if (s1.Equals(s2))
            return 0;
        // 如果 Sunday 作為比較值時，皆回傳 1，表示 Sunday 比較大
        if (0.Equals(s1))
            return 1;
        // 如果 Sunday 作為被比較時，皆回傳 -1，表示 Sunday 比較大
        // Ex. Monday 跟 Sunday 比，回傳 -1 表示小於零，於是 Monday 小於 Sunday
        if (0.Equals(s2))
        {
            Console.WriteLine("sunday equal s2: " + s1 + ", " + s2 + " = -1");
            return -1;
        }

        // 其他排序照舊，不做任何處理
        // CompareTo 執行區分文化特性和區分大小寫的比較。 您無法使用這個方法來執行不區分文化特性或序數比較。
        // 小於零 = 這個執行個體位於 value 之前。
        // 零 = 這個執行個體在排序次序中的位置與 value 相同。
        // 大於零 = 這個執行個體位於 value 之後 or value 為 null。
        Console.WriteLine("compare: " + s1 + " , " + s2 + " = " + s1.CompareTo(s2));
        return s1.CompareTo(s2);
    }
}
```

![](https://i.imgur.com/RFdSxTL.png)


<iframe width="100%" height="700" src="https://dotnetfiddle.net/Widget/vW5WFZ" frameborder="0"></iframe>