顯示具有 C# 標籤的文章。 顯示所有文章
顯示具有 C# 標籤的文章。 顯示所有文章

2010年3月21日 星期日

.NET - 兩個陣列的合併

很常用到的功能,可以把兩個陣列合併成一個陣列,不需要寫一堆程式碼來合併。

合併的語法是利用陣列的聯集(Union)來做,
以下是a和b聯集
int[] c = a.Union(b).ToArray();

不過,因為是用集合的聯集來實作,所以遇到重複元素,就會被刪掉:
int[] a = { 1, 2, 3, 4, 5 };
int[] d = { 1, 6, 7, 8, 9 };
int[] e = a.Union(d).ToArray();

這樣的結果,最後就會是{1, 2, 3, 4, 5, 6, 7, 8, 9}
1只會出現一次而已。

同樣的,聯集也不會幫忙做排序。
int[] a = { 1, 2, 3, 4, 5 };
int[] f = { 7, 9, 8, 12, 6 };
int[] g = a.Union(f).ToArray();

這樣的結果,就會是:{1, 2, 3, 4, 5, 7, 9, 8, 12, 6}

簡單的說,集合該做的事情,不會少做。不該做的事情,也不會多做。

如果需要排序的話,簡單的元素,可以利用Array.Sort()來實作即可。
它會自動做由小而大排序。
Array.Sort(g);

若是自訂的類別,則必須要是IComparable的泛型實作才可以用。

程式最後的結果就像是

2010年2月19日 星期五

.NET - 建立Visual Studio 2008的臨時性專案的方法

在寫測試用的臨時程式時,
Visual Studio 2008最麻煩的地方就是一定要建立方案、專案,
而且還必須要存檔到桌面或是其他地方,
時間一久、或是測試的檔案一多,
就會變出很多亂七八糟的檔案,很麻煩。
也就因此會讓一些人懷念起Visual Studio 6的年代。

在參考.NET菜鳥自救會後,
發現其實Visual Studio 2008也有臨時性專案的功能,
我將作法整理、記錄如下:

  1. 開啟『工具』→『選項』。

  2. 在『選項』視窗內的『專案和方案』設定值中有個『建立時儲存新專案』。
    預設值為『打勾』。將它取消設定就不會在建立新專案時,必須先建立專案並存檔。

  3. 下面的圖檔,左邊的為預設值;右邊的為修改後(取消後)的狀況。
    可以發現修改後,建立新專案就沒有『名稱』和『位置』的選項。




  4. 這樣建立的專案,在關閉專案時,就會跳出是否要存檔的設定。
    其他包含建置專案、執行專案…等的設定。都會在Visual Studio預設的暫存目錄下,
    進行建置的動作。

  5. 不過經過測試,只有Visual Basic和Visual C#這兩個有效。
    Visual C++就還是會有要求要設定目錄。

2009年11月30日 星期一

C#-ArrayList與Array之間的互換

ArrayList可以動態的增加元素,所以有時候在不知道數量的情形下,相當的好用。
但是某些視窗元件卻只支援Array,而且Array的執行速度也比較快。
所以常常會有兩個互相轉換的需求,
下面記錄了兩個之間互換的方法。


  1. Array轉換成ArrayList
    這個有兩種方法:

    1. 使用建構子具有ICollection介面的版本:
    2. 使用靜態方法Adapter,該方法具有IList介面:

  2. ArrayList轉換成Array
    直接用ArrayList.ToArray即可

直接看程式碼吧!

static void Main(string[] args)
{
    // Array轉換成ArrayList
    int[] a = { 1, 2, 3, 4, 5, 6 };

    // 1) 使用ArrayList建構子中,實作ICollection的方法
    ArrayList arr1 = new ArrayList(a);

    foreach (int i in arr1)
    {
        Console.WriteLine(i);
    }

    // 2) 使用ArrayList的靜態方法Adapter,實作IList的方法
    ArrayList arr2 = ArrayList.Adapter(a);

    foreach (int i in arr2)
    {
        Console.WriteLine(i);
    }

    // ArrayList轉換成Array
    // 使用ToArray方法
    int[] b = (int[])arr1.ToArray(typeof(int));
    //int[] b = (int[])arr1.ToArray(Type.GetType("System.Int32"));

    foreach (int i in b)
    {
        Console.WriteLine(i);
    }
}

範例程式下載:

2009年5月28日 星期四

C#-.NET調用Excel API

寫程式需要輸出資料的時候,希望能夠整理的很漂亮,常常會希望能夠輸出成xls或xlsx的Excel檔案,
雖然也可以使用csv檔案格式,但是觀看的時候,沒辦法直接用Excel開啟,用記事本打開又不漂亮。

過去微軟沒有直接提供調用Excel函式的功能,不過在.NET時代,微軟總算整合進去了。

下面將要介紹簡單的Excel操作方法,包括開檔、存檔,以及填入表格的功能。
範例是利用WinForm去選擇欄位,並填入資料,最後會再存成一個xlsx檔案(Excel 2007格式)。

  1. 要使用Excel,需要先引入Excel的DLL檔案(Microsoft.Office.Interop.Excel)
    VS.NET2008有兩個DLL檔,11.0版為Excel 2003;12.0版為Excel 2007的。
    匯入Excel的DLL檔案
  2. Excel的架構是活頁簿(Excel的檔案)、工作表(一個檔案可以有多個工作表Sheet)、欄位(由欄、列來組成)。
    因此,使用上需要幾個類別實體來操作:
    (A) Application
    (B) Workbook - 操作活頁簿
    (C) Worksheet - 操作工作表
    (D) Range - 操作欄位(可以為某個矩形範圍,如 A3-C5

    using Microsoft.Office.Interop.Excel;
    //引用Excel Application類別
    _Application myExcel = null;
    //引用活頁簿類別
    _Workbook myBook = null;
    //引用工作表類別
    _Worksheet mySheet = null;
    

  3. 首先,在範例裡面,我在載入WinForm後,將Excel的實體初始化。動作上就如前面說的,依序把Application, 活頁簿, 工作表初始化,並且設定焦點。

    private void InitExcel()
    {
          //開啟一個新的應用程式
          myExcel = new Microsoft.Office.Interop.Excel.Application();
          //加入新的活頁簿
          myExcel.Workbooks.Add(true);
          //停用警告訊息
          myExcel.DisplayAlerts = false;
          //讓Excel文件可見 
          myExcel.Visible = true;
          //引用第一個活頁簿
          myBook = myExcel.Workbooks[1];
          //設定活頁簿焦點
          myBook.Activate();
          //引用第一個工作表
          mySheet = (_Worksheet)myBook.Worksheets[1];
          //命名工作表的名稱為 "Array"
          mySheet.Name = "測試";
          //設工作表焦點
          mySheet.Activate();
    }
    

  4. 需要設定欄位資料的時候,再調用Range來做事。
    範例中,是利用兩個Textbox來選定欄位(.get_Range),再利用第三個Textbox來給定值(.Value2)。

    private void buttonSet_Click(object sender, EventArgs e)
    {
    string col = (string)comboBoxCol.SelectedItem;
    string row = (string)comboBoxRow.SelectedItem;
    Range myRange = null;
    myRange = mySheet.get_Range(col + row, Type.Missing);
    myRange.Value2 = textBoxData.Text;
    }
    

  5. 最後,在程式終了時,將Excel存檔(.SaveAs),並釋放資源。

    private void button1_Click(object sender, EventArgs e)
    {
          //另存活頁簿
          myBook.SaveAs(filename, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, XlSaveAsAccessMode.xlNoChange, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
          //關閉活頁簿
          myBook.Close(false, Type.Missing, Type.Missing);
          //關閉Excel
          myExcel.Quit();
          //釋放Excel資源
          System.Runtime.InteropServices.Marshal.ReleaseComObject(myExcel);
          myBook = null;
          mySheet = null;
          myExcel = null;
          GC.Collect();
    }
    


範例程式畫面如下:

範例程式

範例程式下載:Excel範例程式

2009年4月22日 星期三

C#-.NET計算運算時間

進行研究、程式、演算法的開發時,
常常會需要計算運算時間,
.NET提供了不錯,且方便的類別工具(Stopwatch)來進行時間的計算。

使用方法很簡單:

首先必須要引入System.Diagnostics的名稱空間。
using System.Diagnostics;

只要在想要開始計算時間時,利用StartNew()函式開始一個新的Counter。

Stopwatch sw;
sw = new Stopwatch();    //Stopwatch類別在System.Diagnostics命名空間裡
sw.Reset();
sw = Stopwatch.StartNew();

再結束計算時間的時候,使用Stop()函式結束計時功能即可。

sw.Stop();

最後,再利用TimeSpan把時間顯示出來即可。

TimeSpan el = sw.Elapsed;
String Text = el.ToString();

附件檔案是利用WPF撰寫的一個DEMO程式。
功能是點下Start按鈕的時候,開始計算時間。按下End按鈕的時候,結束計算時間。

其他還有一些TimeSpan類別還有提供各種顯示時間的方法,
包括以時、分、秒或是日之類的方式顯示,都可以在MSDN上查到。

附件檔案:計算運算時間範例程式

2009年4月8日 星期三

C#-字元與字串切割方法

字元切割-在字串裡面,依指定字元(範例中的,)切割成數個子字串回傳的方法。
字串切割-在字串裡面,依指定字串(範例中的##)切割成數個子字串回傳的方法。

String str = "a,b,c";
String str1 = "a##b##C";
Console.WriteLine("字元切割:");

//字元切割
String[] s = str.Split(',');
foreach (String k in s)
{
        Console.WriteLine(k);
}
Console.WriteLine("字串切割:");

//字串切割
String[] s1 = System.Text.RegularExpressions.Regex.Split(str1, "##");
foreach (String k in s1)
{
        Console.WriteLine(k);
}


這是程式執行的結果:

2009年4月6日 星期一

以Windows Form實現視窗最小化至通知區域

  1. 建立一個Windows Form專案
  2. 替專案加入一個Notify Icon控制項

  3. 替Notify ICON控制項加入一個圖示("ICON"),必須為ico格式,可以利用ToYcon製作。
    若沒有製作的話,會無法在通知區域顯示該圖示。
    並且替Notify ICON控制項設定"Text"以及"Name"。

  4. 替NotifyICON設定項加入一個"DoubleClick事件",並加入下述程式碼
  5. private void notifyIcon1_DoubleClick(object sender, EventArgs e)
    {
        if (this.WindowState == FormWindowState.Minimized)
        {
            this.ShowInTaskbar = true;          // 顯示在系統任務欄
            this.WindowState = FormWindowState.Normal;      // 還原視窗
            notifyIcon1.Visible = false;         //Notify Icon圖示隱藏
        }
    }
    
  6. 替Form加入一個"SizeChanged事件",並加入下述程式碼
  7. private void Form1_SizeChanged(object sender, EventArgs e)
    {
        if (this.WindowState == FormWindowState.Minimized)  // 目前視窗是否為最小化
        {
            this.ShowInTaskbar = false;     //不顯示在系統任務欄
            notifyIcon1.Visible = true;      //Notify Icon圖示顯示
        }
    }
    

這樣就完成了,可以執行測試看看。
點選視窗最小化的時候,可以把視窗縮小到系統通知區。
在系統通知區內點兩次程式的ICON,就可以恢復視窗程式了!

範例程式下載:


ToYcon v0.6下載:

2009年3月27日 星期五

EmguCV - .NET版本的OpenCV

轉換到C#一陣子了,
個人認為C#撰寫上確實比C++方便許多,
文法上也比較簡單,
不過指標必須要宣告成unsafe是比較麻煩一些,
也多了一些對於指標的限制(例如自定的ref class不能夠使用指標之類的...)

之前有在玩OpenCV,
然而他是以unmanaged的C與C++撰寫的,
所以.NET不支援了。

網路上有很多很有心的玩家把OpenCV轉換成C#版本,
不過都已經停止開發了,諸如OpenCV.NET之類的。

日前找到了目前還在開發,而且似乎較完整的版本-EmguCV,下面是官方網站的一個比較表。
如果你還在找適合.NET環境的OpenCV,可以考慮加入EmguCV的行列。

EmguCV官方網站:http://www.emgu.com/wiki/index.php/Main_Page