2010年12月4日土曜日

C# 備忘録

#if
C言語のように#if 1をやろうとすると、コンパイルエラーとなる。
#if trueだとOKだった

LISTと配列の変換
http://www.ipentec.com/document/document.aspx?page=csharp-generics-array
ドライブの情報取得
ドライブの一覧とそのタイプなどを取得。
http://www.atmarkit.co.jp/fdotnet/dotnettips/557driveinfo/driveinfo.html
ファイル、フォルダの一覧を取得
http://www.atmarkit.co.jp/fdotnet/dotnettips/053allfiles/allfiles.html
文字列の先頭に@マーク。これなんだ?
エスケープシーケンスを無視するマーク。
http://dhive.jp/blog/yama/?p=1149

usingが関数の中にあるとき
int func()
{
  using (オブジェクト) 
  {
  }
}
のようなかたちをしているときがある。

これはオブジェクトの生存範囲を明確にしたいときに使用する。
詳しくはこちらで、
http://msdn.microsoft.com/ja-jp/library/yh598w02(v=vs.80).aspx

DataGridViewとパフォーマンス

DataGridViewに情報をセットするときに次のような感じでごりごりやってました。

// 見出しをdatagridviewに入力
foreach (string str in Columns)
{
    dataGridView1.Columns.Add(str, str);
}

// 中身を入力 (行を繰り返し入力していく。)
int nColmn = 0;
Dictionary dict;
dict = cdate.GetData();
foreach (string key in dict.Keys)
{
    // 文字列をgridviewに登録。
    string[] strtmp = new string[dict[key].Length];
    for ( int i = 0; i < dict[key].Length; i++)
    {
        strtmp[i] = dict[key][i].str;
    }
    dataGridView1.Rows.Add(strtmp);
}


ですが、データの行数が2万ぐらいになったら、めちゃくちゃおそくなってしまい。。。
なので、DataTableにデータをつくっておいて、その後DataGridViewのDatasourceとして
登録するようにしたらだいぶよくなりました。

// 見出しをdatagridviewに入力 
DataTable dt = new DataTable();
foreach (string str in Columns)
{
    dt.Columns.Add(str, str.GetType());
}

// 中身を入力 (行を繰り返し入力していく。)
int nColmn = 0;
Dictionary dict;
dict = cdate.GetData();
foreach (string key in dict.Keys)
{
    // 文字列をgridviewに登録。 
    string[] strtmp = new string[dict[key].Length];
    for (int i = 0; i < dict[key].Length; i++)
    {
        strtmp[i] = dict[key][i].str;
    }
    dt.Rows.Add(strtmp);
}
dataGridView1.DataSource = dt;