タグ別アーカイブ: C#

DynamicLTSV:ルート名前空間をLTSVに変更

masaru-b-cl/DynamicLTSV · GitHub

NuGet Gallery | DynamicLTSV 1.2.0

 

DynamicLTSVはこれまでSystem.Text名前空間に定義していましたが、.NET Frameworkに存在する名前空間を拡張することにより、DynamicLTSVを使わないソースでも有効になってしまいます。

これを防ぐため、いまさらですがルート名前空間を変更し、”LTSV”としました。

 

DynamicLTSVを使用する際は、以下のusingを指定するようにしてください。

 

using LTSV;

 

DynamicLTSVもひとまずこれで一区切りにしようと思います。

広告

DynamicLTSV:匿名型オブジェクトからLTSV作成

masaru-b-cl/DynamicLTSV · GitHub

NuGet Gallery | DynamicLTSV 1.1.0

 

匿名型などのオブジェクトから、簡単にLTSVを作成するための拡張メソッド、ToLTSVString()を追加しました。

次のように実行できます。

 

 

LINQと組み合わせれば、簡単に思い通りのLTSVが作れますね!

DynamicLTSV:LTSVなアクセスログをLINQで処理

DynamicLTSV:LTSVをパースし、動的にアクセス&動的にLTSV生成 « be free

で作成したDynamicLTSVですが、LINQとの相性もばっちりです。

 

こんなLTSVなアクセスログファイルがあったとします。

 

 

こいつをこんな感じでメソッドチェーンで処理できます。例はhostがローカルネットワークのもののUAを抽出しています。

 

 

image

 

LINQでパイプライン処理も楽々ですなぁ。

DynamicLTSV:LTSVをパースし、動的にアクセス&動的にLTSV生成

【今北産業】3分で分かるLTSV業界のまとめ【LTSV】 – naoyaのはてなダイアリー

 

なんかLTSVが流行ってるようなので、C#で参戦!

 

DynamicLTSV

masaru-b-cl/DynamicLTSV · GitHub

C#でスキーマレスなデータ相手にすると言ったら、当然dynamicですよね。DynamicLTSVを使うと、お手軽にこんな感じでLTSVデータのパース、アクセス、並びに生成ができます。

 

 

実装は?

中身ですが「neue cc – dynamicとQueryString、或いは無限に不確定なオプション引数について」ほぼそのままです。staticメソッドでパースするようにしたくらいですね。

ライセンスはNYSLにしてあります。煮るなり焼くなりお好きにどうぞ。たとえば、「System.Text名前空間を汚していて許せない!」という人は、System.Text.Ltsv名前空間にでもなんにでも変えてくださいませませ。

とりあえず、いろいろ適当ですので、こんな風にしたらよくなるよとかあったら是非Pull Requestなりコメントなり、なんなりと。

 

まとめ

いやー、C#ってとってもゆるふわでLightweightなもんですねぇ。

IEnumerableの型を指定したforeach #adcjcs by @masaru_b_cl

この記事はC# Advent Calender 2012 : ATNDへの参加エントリーです。

昨日は@ishisakaさんの「C#でYAMLを使えるか試してみた | OPC Diary – No Code, No Life.」でした。

 

IEnumerable型

古き良きC# 1.0の時代より受け継がれる「Iteratorパターン」のためのインターフェースであるIEnumerable型。.NET 2.0からジェネリック版のIEnumerable<T>型が追加され、昨今では黒歴史扱いを受けたりしています。

しかし、いまだにIEnumberable型のみを実装した型も少なくありません。たとえばSystem.Windows.Forms.Control.ControlsプロパティのControlCollection型などがあります。

そのため、画面のコントロールをすべて舐めるような処理も、型のないIEnumerable型を使う必要があります。

 

foreachによる列挙

IEnumerabe型の列挙といえば、foreachです。for?なにそれ?

ただ、すでに述べたようにIEnumerable型の要素をただ列挙しても、Object型としてしか取得することができません。

// 型推論に任せる
foreach (var item in source)
{
  // itemはObject型になるので、型変換が必要
  var person = item as Person;
  Console.WriteLine("{0}, {1}, {2}", person.Id, person.Name, person.Age);
}

 

これを解決するために、LINQのCast<T>演算子を使うといった方法がありますが、余計な処理が一枚かんでいるという印象はぬぐえません。

// Cast<T>メソッドを通す
foreach (var person in source.Cast<Person>())
{
  Console.WriteLine("{0}, {1}, {2}", person.Id, person.Name, person.Age);
}

 

そこで、おすすめなのが、明示的に型を指定することです。こうすることで、自動的にキャストが行われるため、コードがすっきりします。

// 明示的に型を指定する
foreach (Person person in source)
{
  // personは自動的にPerson型にキャストされる
  Console.WriteLine("{0}, {1}, {2}", person.Id, person.Name, person.Age);
}

 

このことは、C#言語仕様(%ProgramFiles%\Microsoft Visual Studio 11.0\VC#\Specifications\1041\CSharp Language Specification.docx) p.279 「8.8.4 foreachステートメント」の次の内容に対応しています。

ステートメントは次の形式になります。

foreach (V v in x) embedded-statement

 

これは次のように展開されます。

{
  E e = ((C)(x)).GetEnumerator();
  try {
    while (e.MoveNext()) {
      V v = (V)(T)e.Current;
      embedded-statement
    }
  }
  finally {
    … // Dispose e
  }
}

 

サンプル

 

まとめ

C#にはこういった楽をするためのsyntax sugarがたくさんあります。たまに言語仕様をチェックしてみるのも楽しいのではないでしょうか。

次は@Marimoiroさんにバトンタッチです。

C#でゲームつくるです [C# Advent Calender 2012]C#を補助するいろんな脇役