2014/05/28

[C#, VB.NET] 配列文字列を区切り文字を使って連結

String.Join メソッドは、配列の要素を指定した区切り文字で連結する。

String.Join メソッド - msdn
http://msdn.microsoft.com/ja-jp/library/system.string.join%28v=vs.110%29.aspx

var dat = new string[] { "Michael", "Christopher", "Joshua", "Matthew", "Daniel" };
var ret = String.Join(",", dat);
// Michael,Christopher,Joshua,Matthew,Daniel
Console.WriteLine(ret);

var dat2 = new List() { "Robert", "James", "Nicholas" };
var ret2 = String.Join(",", dat2);
// Robert,James,Nicholas
Console.WriteLine(ret2);
VB.NET の場合も同等の動きをするのだが、Join 関数は VB にしかない。
C# と比較するとなかなか興味深い動作である。
Dim data As String() = {"Michael", "Christopher", "Joshua", "Matthew", "Daniel"}
Dim result = String.Join(",", data)
' Michael,Christopher,Joshua,Matthew,Daniel
Console.WriteLine(result)

' Join 関数は区切り文字を省略できる。
Dim result2 = Join(data)
' Michael Christopher Joshua Matthew Daniel
Console.WriteLine(result2)

' Join 関数で区切り文字を指定する場合は、第二引数に指定する。
Dim result3 = Join(data, ",")
' Michael,Christopher,Joshua,Matthew,Daniel
Console.WriteLine(result3)
Join 関数 (Visual Basic) - msdn
http://msdn.microsoft.com/ja-jp/library/b65z3h4h%28v=vs.90%29.aspx

2014/05/27

[C#] イベントログへの書き込み(Windows Vista, 7...以降)。


イベントログへの書き込みについては、以下のようなサンプルをよく見かける。
ソースの存在チェックを行ってから、イベントログへ書き込みを行う処理だ。
var source = "EventLogTest";
var logname = "Application";
var message = "イベントログに書込むテスト。";
var eventId = 9999;
var category = (short)100;
var rowData = System.Text.Encoding.Unicode.GetBytes("ABCDEFGH");

if (!System.Diagnostics.EventLog.SourceExists(source))
{
 var eventSourceData = new EventSourceCreationData(source, logname);
        EventLog.CreateEventSource(eventSourceData);
}
EventLog.WriteEntry(source, message, System.Diagnostics.EventLogEntryType.Error, eventId, category, rowData);
しかし、Windows Vista 以降ではユーザーアカウント制御 (UAC) により、イベントソースへの問い合わせを行った時点で例外が発生する。

型 'System.Security.SecurityException' のハンドルされていない例外が System.dll で発生しました
追加情報:ソースが見つかりませんでしたが、いくつかまたはすべてのログを検索できませんでした。アクセス不可能なログ: Security

Visual Studio を管理者権限で実行するか、他の方法であらかじめソースの登録を行っておくしかない。

[C#] 正規表現で角括弧 [ ] の中身を取得

角括弧 [] は .Net Framework ではメタ文字として扱われるため、それ自体を対象にしたい場合はバックスラッシュ(\)でエスケープをしなければならない。

.NET Frameworkがサポートする正規表現クラスを徹底活用する ― (3/4) - @IT
http://www.atmarkit.co.jp/ait/articles/0304/12/news002_3.html

確実に角括弧の中に含まれている文字列を取得したい場合は以下のようにする。
var input = "テスト[[[あいうえお[Code=9999]テストテスト[Code=]]]";
var regex = new Regex(@"\[Code=(?.*?)\]");            
var match = regex.Match(input);
var result = match.Groups["value"].Value;
Console.WriteLine(result);

// Regex の定義が重要。クエッションマークの有無で結果がかなり異なってくる。

// @"\[Code=(?.*?)\]"
// 結果 : 9999

// @"\[Code=(?.*)\]"
// 結果 : 9999]テストテスト[Code=]]

2014/05/12

[Google マップ] 元のバージョンに戻せる

Google マップは、以前のバージョンに戻すことができる。
画面右下の 「?」 マークをクリックすると、「以前のマップに戻る」 というメニューがある。
新しい Google マップ についての意見を聞かれる。チェックを入れなくても良いが、戻す場合は 「以前の Google マップに戻る」 リンクをクリックする。
旧バージョンのマップに戻る。今度も旧バージョンを使用するかどうか聞かれるので選択する。

個人的には、新しいマップはとにかく動作が重くなり、ストリートビューが使いづらくなった印象だった。この手順で旧バージョンの Google マップを使えるのだが、正直いつまでこれが通用するか不明である。

2014/05/02

[C#] AD の ObjectGUID を文字列変換。

Active Directory (AD) のオブジェクトを System.DirectoryServices.DirectoryEntry を使用して取得する際、objectGUID は byte 型で返却される。
これを文字列にしたい場合、Guid オブジェクトの ToString メソッドで変換するのだが、引数により取得できる文字列が異なる。
// かっこあり : ToString("B") でも可。
// {1bac5384-da6d-46c9-9b41-c8894cd7b159}
var guid1 = new Guid((byte[])directoryEntry.Properties["objectGUID"][0])

// ハイフンあり(デフォルト)。
// 1bac5384-da6d-46c9-9b41-c8894cd7b159
var guid2 = new Guid((byte[])directoryEntry.Properties["objectGUID"][0]).ToString("D")

// ハイフンなし。
// 1bac5384da6d46c99b41c8894cd7b159
var guid3 = new Guid((byte[])directoryEntry.Properties["objectGUID"][0]).ToString("D")

// 丸かっこあり。
// (1bac5384-da6d-46c9-9b41-c8894cd7b159)
var guid4 = new Guid((byte[])directoryEntry.Properties["objectGUID"][0]).ToString("D")

2014/05/01

[C#] コマンドプロンプトの窓を非表示にする


アプリケーションの中で、Process.Start メソッドを使用して他のコンソール・アプリケーションの EXE を起動させるとき、しばしば「黒い窓」を出したくないという要望がある。
そういう場合には ProcessStartInfo クラスのプロパティを設定するとよい。
var startInfo = new ProcessStartInfo();
startInfo.FileName = @".\Test2.exe";
startInfo.CreateNoWindow = true;
startInfo.UseShellExecute = false;

// さらに処理終了まで同期して待つ場合
var process = Process.Start(startInfo);
process.WaitForExit();
コマンド・プロンプトを表示せずにコンソール・アプリケーションを実行するには?[C#、VB]- @IT
http://www.atmarkit.co.jp/fdotnet/dotnettips/654nowinexec/nowinexec.html


なお、窓を完全に非表示にしたい場合は、プロジェクトのプロパティから、アプリケーションの種類を「Windows フォーム アプリケーション」に変更する。
この設定を行うと、まったくウィンドが出ずに処理が開始される。

コマンド・プロンプトを表示しないコンソール・アプリケーションを作成するには?[C#、VB]
http://www.atmarkit.co.jp/fdotnet/dotnettips/837nodisplayconsole/nodisplayconsole.html
Related Posts Plugin for WordPress, Blogger...