[C#] 問號"?"用法

在C#中「?」有三種用法。

  1. 可空類型修飾符(?):引用類型可以使用空引用表示一個不存在的值,而值類型通常不能表示為空,例如:string str=null;是正確的。int i=null;編譯器將報錯。為了使值類型也可為空,可空類型出現了,可空類型使用可空類型修飾符?來表示,表現形式為T?。例:int? 表示是可空的整形,DateTime?表示為可空的時間。T?其實是System.Nullable<T>(泛型結構)的縮寫形式,也就意味著當你用到T?時編譯器在編譯時會把T?編譯成System.Nullable<T>的形式,例如:int?,編譯後便是System.Nullable<int>的形式。
  2. 三元(運算符)表達式(?:)。
  3. 空合併運算符(??):用於定義可空類型和引用類型的默認值。如果此運算符的左操作數不為 null,則此運算符將返回左操作數;否則返回右操作數。 例:a ?? b,當a為null時則返回b,a不為空時返回a本身。空合併運算符為右結合運算符,即操作時從右向左進行組合的。如,「a ?? b ?? c」的形式按「a ?? (b ?? c)」計算。

文章來源:http://blog.csdn.net/loveyou128144/article/details/4409706

發表在 C#

[C#] Compare two string Arrays

比較 string Array
http://www.dotblogs.com.tw/rainmaker/archive/2012/02/02/67456.aspx

比較兩個 DataTable

/// <summary>
/// 比較兩個DataTable數據(結構相同)
/// </summary>
/// <param name="dt1">來自數據庫的DataTable</param>
/// <param name="dt2">來自文件的DataTable</param>
/// <param name="keyField">關鍵字段名</param>
/// <param name="dtRetAdd">新增數據(dt2中的數據)</param>
/// <param name="dtRetDif1">不同的數據(數據庫中的數據)</param>
/// <param name="dtRetDif2">不同的數據(圖2中的數據)</param>
/// <param name="dtRetDel">刪除的數據(dt2中的數據)</param>
public static void CompareDt(DataTable dt1, DataTable dt2, string keyField,
    out DataTable dtRetAdd, out DataTable dtRetDif1, out DataTable dtRetDif2,
    out DataTable dtRetDel)
{
    //為三個表拷貝表結構
    dtRetDel = dt1.Clone();
    dtRetAdd = dtRetDel.Clone();
    dtRetDif1 = dtRetDel.Clone();
    dtRetDif2 = dtRetDel.Clone();

    int colCount = dt1.Columns.Count;

    DataView dv1 = dt1.DefaultView;
    DataView dv2 = dt2.DefaultView;

    //先以第一個表為參照,看第二個表是修改了還是刪除了
    foreach (DataRowView dr1 in dv1)
    {
        dv2.RowFilter = keyField + " = '" + dr1[keyField].ToString() + "'";
        if (dv2.Count > 0)
        {
            if (!CompareUpdate(dr1, dv2[0]))//比較是否有不同的
            {
                dtRetDif1.Rows.Add(dr1.Row.ItemArray);//修改前
                dtRetDif2.Rows.Add(dv2[0].Row.ItemArray);//修改後
                dtRetDif2.Rows[dtRetDif2.Rows.Count - 1]["FID"] = dr1.Row["FID"];//將ID賦給來自文件的表,因為它的ID全部==0
                continue;
            }
        }
        else
        {
            //已經被刪除的
            dtRetDel.Rows.Add(dr1.Row.ItemArray);
        }
    }

    //以第一個表為參照,看記錄是否是新增的
    dv2.RowFilter = "";//清空條件
    foreach (DataRowView dr2 in dv2)
    {
        dv1.RowFilter = keyField + " = '" + dr2[keyField].ToString() + "'";
        if (dv1.Count == 0)
        {
            //新增的
            dtRetAdd.Rows.Add(dr2.Row.ItemArray);
        }
    }
}

//比較是否有不同的
private static bool CompareUpdate(DataRowView dr1, DataRowView dr2)
{
    //行裡只要有一項不一樣,整個行就不一樣,無需比較其它
    object val1;
    object val2;
    for (int i = 1; i < dr1.Row.ItemArray.Length; i++)
    {
        val1 = dr1[i];
        val2 = dr2[i];
        if (!val1.Equals(val2))
        {
            return false;
        }
    }
    return true;
}

Windows 7 USB 有問題的解法…

http://hikari-solving.blogspot.tw/2012/03/windows-7-usbwe-were-unable-to-copy.html

這應該是讀取某些隨身碟的MBR(Master Boot Record),導致無法進行後續的寫入動作
而MBR是一般格式化所無法更動的,所以不論是Windows在製作時重新格式化
或者自己格式化都沒用

解決方法:重新建立MBR

step 1.
執行命令提示字元(或在啟動中輸入cmd)

step 2.
輸入diskpart
如出現「是否允許這個程式存取你的電腦」,選擇是
這樣就會啟動diskpart程式

step 3.
輸入list disk
會出現你現在所有的磁碟槽

step 4.
輸入 select disk x
(x帶入你想格式化的隨身碟)
選擇要操作的硬碟

step 5.
依序輸入
clean
create partition primary
active
format quick fs=fat32
(或是 format quick fs=ntfs)
assign
exit

結束程式之後,再重新製作Windows 7 USB 安裝程式即可

microsoft .net framework ngen

更新 .net framework 後 ngen 功能會執行一斷長時間
解決方法 在某些情況下,安裝 Microsoft .NET Framework 4 更新的時間可能比預期還長

讓我自行修正此問題

如果要解決這個問題,您可以強制 NGen.exe 捨棄先前產生的原生映像,直接產生新的原生映像,藉此可多少縮短產生原生映像的時間。
如果要減少重新產生所耗費的時間,請在安裝 .NET Framework 4 更新之前立即開啟提高權限的命令提示字元,並執行下列命令。
重要套用此更新之前,請立即執行這些命令。否則,這些命令的作用便會減弱。

執行 32 位元 Windows 作業系統的電腦:
%windir%\microsoft.net\framework\v4.0.30319\ngen.exe update /force /queue

執行 64 位元 Windows 作業系統的電腦:
%windir%\microsoft.net\framework\v4.0.30319\ngen.exe update /force /queue
%windir%\microsoft.net\framework64\v4.0.30319\ngen.exe update /force /queue

[C#] 複合格式字串, .Format .WriteLine 等等~

原出處:微軟

.NET Framework 複合格式功能會採用物件清單和複合格式字串做為輸入。 複合格式字串是由混合索引替代符號 (Placeholder) 的固定文字所組成 (這些符號稱為對應至清單內物件的格式項目)。 格式作業產生的結果字串是由原始固定文字所組成,這些固定文字混合了清單中代表物件的字串。
下列方法支援複合格式功能:

  • String.Format ,傳回格式化的結果字串。
  • StringBuilder.AppendFormat ,將格式化的結果字串附加至 StringBuilder 物件。
  • Console.WriteLine 方法的部分多載,對主控台顯示格式化的結果字串。
  • TextWriter.WriteLine 方法的部分多載,將格式化的結果字串寫入至資料流或檔案。 衍生自 TextWriter 的類別,例如 StreamWriter 和 HtmlTextWriter,也會共用這項功能。
  • Debug.WriteLine(String, Object[]) ,將格式化的訊息輸出至追蹤接聽項。
  • Trace.TraceError(String, Object[]) 、Trace.TraceInformation(String, Object[]) 和 Trace.TraceWarning(String, Object[]) 方法,將格式化的訊息輸出至追蹤接聽項。
  • TraceSource.TraceInformation(String, Object[]) 方法,將告知性方法寫入至追蹤接聽項。

複合格式字串

複合格式字串和物件清單會當做支援複合格式功能之方法的引數來使用。 複合格式字串是由零個或更多段與一個或多個格式項目混合的固定文字所組成, 固定文字是您選擇的任何文字,而每個格式項目都會對應到清單內的一個物件或 boxed 結構。 複合格式功能將會傳回新的結果字串,其中每一個格式項目都會由清單內對應物件的字串表示來取代。
請考量下列 Format 程式碼片段。

string myName = "Fred";
String.Format("Name = {0}, hours = {1:hh}", myName, DateTime.Now);

固定的文字為 “Name = " 和 “, hours = “。 格式項目為 “{0}" (其索引為 0,且會對應至物件 myName) 及 “{1:hh}" (其索引為 1,且會對應至物件 DateTime.Now)。

格式項目語法

每個格式項目都會使用下列格式,並由下列元件所組成:
{ index[,alignment][:formatString]}
成對的大括號 (“{" 和 “}") 是必要的。
-索引元件
強制的 index 元件 (也稱為參數規範) 是用以識別物件清單中對應項目的數字 (從 0 開始)。 也就是說,參數規範為 0 的格式項目會格式化清單中的第一個物件,而參數規範為 1 的格式項目會格式化清單中的第二個物件,依此類推。
多個格式項目可以藉由指定相同參數規範來參考物件清單中的相同項目。 例如,您可以指定複合格式字串 (如:"{0:X} {0:E} {0:N}") 來格式化十六進位、科學格式和數字格式的相同數值。
每個格式項目皆可參考清單內的任何物件。 例如,如果有三個物件,您可以指定複合格式字串 (如:"{1} {0} {2}") 來格式化第二個、第一個和第三個物件。 不是格式項目所參考的物件會被忽略。 如果參數規範指派超出物件清單範圍的項目,即會產生執行階段例外狀況。
-對齊元件
選擇性 alignment 元件為帶正負號的整數 (Signed Integer),它指示慣用的格式化欄位寬度。 如果 alignment 的值小於格式化字串的長度,alignment 會被忽略而使用格式化字串的長度當做欄位寬度。 如果 alignment 為正數,欄位中的格式化資料會靠右對齊;如果 alignment 為負數,則會靠左對齊。 如果填補有必要,則會使用泛空白字元 (White Space)。 如果指定了 alignment,逗號即是必須的。
-格式字串元件
選擇性的 formatString 元件是一個格式字串,適用於將格式化的物件類型。 如果對應的物件為數值,請指定標準或自訂數值格式字串;如果對應的物件為 DateTime 物件,請指定標準或自訂日期和時間格式字串;或者,如果對應的物件為列舉值,請指定列舉格式字串。 如果未指定 formatString,則會使用數值、日期和時間或列舉類型的一般 (“G") 格式規範。 如果指定 formatString,則需要冒號。

發表在 C#