PIXNET Logo登入

夢多了,就會是現實

跳到主文

分享一路上做過的點點滴滴, 記錄種種曾經遇到難關與解決方法 受前人幫忙之餘, 也希望自己能夠盡一點心力幫助他人

部落格全站分類:心情日記

  • 相簿
  • 部落格
  • 留言
  • 名片
  • 7月 19 週二 201615:55
  • C# 陣列排序


在C# 裡面有提供內建的排序方法,內部使用Quicksort algorithm,這邊介紹三種解法對不同的需求進行排序。
  • Primitive types

  • Custom types using delegate

  • Custom type using ICompareable

  • Array.Sort()

     
    int,double,string 都能夠輕易地使用Array.Sort(Array)來做排序,因為他們都繼承IComparable interface.
    現在來看第一個例子
     
    排序整數

    // sort
    int arrayint[] intArray = new int[5] { 8, 10, 2, 6, 3 };
    Array.Sort(intArray);
    // write array
    foreach (int i in intArray) Console.Write(i + " "); // output: 2 3 6 8 10


     
    排序字串

    // sort string array
    string [] stringArray = new string[ 5 ] { "Banana" , "Watermelon" , "Tomato" , "Water" , "Apple" };
    Array.Sort( stringArray );
    // write array
    foreach ( string str in stringArray) Console .Write ( str + " " ); // output: Apple Banana Tomato Water Watermelon


     
     
     
    有時候我們需要排序的不僅只是單一個型態,而是一具有多屬性的物件,並且針對其中一個屬性作排序。
    這時候就需要用到 delegate 搭配 anonymous method 來完成,使用Comparison<T>的delegate,定義如下
     

    public delegate int Comparison<T> (T x, T y)


     
    可以看到該泛型Comparesion 傳入兩個相同型態的參數,回傳值為:
    <0 : X < Y
    0:X = Y
    >0 : X > Y
     
    接下來示範排序一個自訂義型態物件的陣列。我們會用到上面提到的匿名委派方法。
     
    定義一個類別具有兩個屬性Name,Height

    class Student
    {
    public string Name { get ; set ; }
    public int Height { get ; set ; }
    }


     
     
    使用delegate搭配 anonymous method 來進行排序,這裡依照Height屬性由小到大來排序

    Student [] studentAry = new Student[]{
    new Student { Name = "A1" , Height= 180 },
    new Student { Name = "B1" , Height= 170 },
    new Student { Name = "C1" , Height= 175 }
    };
    Array.Sort( studentAry , delegate ( Student s1 , Student s2)
    {
    return s1.Height.CompareTo(s2 .Height );
    });
    foreach ( Student str in studentAry)
    {
    Console.WriteLine( str. Name + " " + str .Height );
    }
    //B1,C1,A1


     
     
  • 使用IComparable來排序陣列

  • 延續上一個議題,我們還可以實作IComparable interface來對一個具有多屬性的物件進行排序,當我們實作IComparable後,Sort內部會呼叫IComparable.ComareTo方法,所以我們必續自己去實現裡面的功能。
     
    把原本的Student實作IComparable,實作一個CompareTo方法。

    class Student : IComparable
    {
    public string Name { get ; set ; }
    public int Height { get ; set ; }
    public int CompareTo( object obj )
    {
    if (obj is Student )
    {
    return this.Height.CompareTo ((obj as Student ).Height );
    }
    throw new ArgumentException ("object is not Student" );
    }
    }


     
     
    而在呼叫端的部分,用法上就跟最初提到的Primitive type 一樣,一行解決!!!

    Student [] studentAry = new Student[]{
    new Student { Name = "A1" , Height= 180 },
    new Student { Name = "B1" , Height= 170 },
    new Student { Name = "C1" , Height= 175 }
    };
    Array.Sort( studentAry );
    foreach ( Student str in studentAry)
    {
    Console .WriteLine ( str. Name + " " + str . Height);
    }
    //B1,C1,A1




     


     
    翻譯自 :http://www.csharp-examples.net/sort-array/
     
     
     
     
    (繼續閱讀...)
    文章標籤

    Chris 發表在 痞客邦 留言(0) 人氣(31,915)

    • 個人分類:C# 小筆
    ▲top
    • 6月 25 週六 201604:51
    • 如何使用 C# 取得 Arduino Yun 的輸出資料

    Arduino Yun是一個非常強大的開發版,人人都會用~!
    但是總是透過C#來取得傳出來的資訊就絕對不是人人都曉得囉
    這裡要來介紹怎麼樣使用 C# 來取得 Arduino 使用Serial.print() 傳出來的資料
    (繼續閱讀...)
    文章標籤

    Chris 發表在 痞客邦 留言(0) 人氣(5,133)

    • 個人分類:C# 小筆
    ▲top
    • 6月 01 週三 201601:12
    • WPF - 使用DrawingBrush繪製色彩相間的地板/棋盤格


    這邊要來講解如何使用DrawingBrush來畫出棋盤格/地板
    今天預計的成果要達到這樣↓↓↓
    (繼續閱讀...)
    文章標籤

    Chris 發表在 痞客邦 留言(0) 人氣(629)

    • 個人分類:C# 小筆
    ▲top
    • 2月 02 週二 201622:09
    • WPF C# DispatcherTimer 用法

    在WPF中如果需要用到Timer 則可以使用DispatcherTimer。
    透過這個Timer,可以直接改變視窗上資料呈現,若使用其他種Timer的話則要進一步使用Dispatcher才能夠實現囉!!
    (繼續閱讀...)
    文章標籤

    Chris 發表在 痞客邦 留言(0) 人氣(9,021)

    • 個人分類:C# 小筆
    ▲top
    • 3月 22 週日 201522:57
    • C# DataTable 合併兩張資料表


    今天遇到一個問題,需要分次從資料庫取出資料,接著把兩張資料表合併起來,我是個懶人,第一步當然就是先找找看有沒有方便的method可以快速使用啦~!
    於是我使用Merge這個方法來完成這個小需求
    果真方便快速^^!! 
    merage 這個method還有許多特殊的用法,這裡只提到最淺顯的合併表格而已
    (繼續閱讀...)
    文章標籤

    Chris 發表在 痞客邦 留言(0) 人氣(10,881)

    • 個人分類:C# 小筆
    ▲top
    1

    熱門文章

    • (60,613)Python 基礎系列 map() 用法解說
    • (31,915)C# 陣列排序
    • (19,518)[C++] static_cast 用法說明 (基礎篇)
    • (12,222)Python 傳值(pass by value) vs 傳址(pass by address) vs 傳物件(pass by object)?
    • (10,881)C# DataTable 合併兩張資料表
    • (9,021)WPF C# DispatcherTimer 用法
    • (5,133)如何使用 C# 取得 Arduino Yun 的輸出資料
    • (3,680)C/C++ : signed int 和 int 宣告差別在哪裡?
    • (629)WPF - 使用DrawingBrush繪製色彩相間的地板/棋盤格
    • (308)SQL 重點語法快速上手(一)

    文章分類

    • Android (1)
    • Python (4)
    • Visual studio 技巧 (1)
    • C++ (3)
    • C# 小筆 (5)
    • 心情小筆 (0)
    • SQL 零基礎上手 (5)
    • 未分類文章 (1)

    最新文章

    • Android 讓物件動起來 : animatorSet
    • [Python] IOError: [Errno 24] Too many open files:
    • [Python] ** 雙星號(double star/asterisk) vs *單星號(star/asterisk) 用法
    • Python 傳值(pass by value) vs 傳址(pass by address) vs 傳物件(pass by object)?
    • [C++] 評估程式碼執行時間
    • [C++] static_cast 用法說明 (基礎篇)
    • Python 基礎系列 map() 用法解說
    • C# 陣列排序
    • 如何使用 C# 取得 Arduino Yun 的輸出資料
    • 在visual studio2013 / 2015 使用XNA

    動態訂閱

    文章搜尋

    參觀人氣

    • 本日人氣:
    • 累積人氣: