がんふぃーるど室長の不定期ブログ

ただいま助手と悪戦苦闘中!

目次

Blog 利用状況

ニュース


自己紹介

名前:がんふぃーるど
肩書:室長
種別:人間・男
資格一覧:
MCP 70-215 Installing, Configurating, and Administering Microsoft Windows 2000 Server
MCTS .NET Framework 2.0 - Distributed Applications
MCTS .NET Framework 2.0 - Web Applications

犬紹介


名前:なうら
肩書:助手
種別:犬・狆・メス
誕生日:2006/7/9
特技:鼻水飛ばし、甘噛、奇襲・急襲・強襲、そそう、お手、お座り、待て

記事カテゴリ

書庫

日記カテゴリ

ギャラリ

2008年7月2日 #

ユーザー定義集計関数…とは微妙に違うCSV形式で文字列を集計 - LINQ

前回はSQL Serverでその前がOracleだったので、ぢゃあ次はLINQってことで試してみました。

LINQの場合(というかC# 3.0の場合)は、Aggregateメソッドとラムダ式でうにゃうにゃっと書けば結構できてしまうので、細かいとこは省いてしまいます。

基本

基本は以下のラムダ式があればほぼ問題無いみたいです。(表現が間違っていたらごめんなさい&指摘して下さい)

(TAccumulate, TSource) => 処理

ということで、実際に集計処理をしてみましょう。

集計処理

サンプルでは適当な家族(family)の匿名型を利用して、性別ごとに家族の名前をカンマ区切りで集計します。

var family = new []{
    new { Name = "父", Age = 40, Sex = "男" },
    new { Name = "母", Age = 40, Sex = "女" },
    new { Name = "娘", Age = 10, Sex = "女" },
    new { Name = "爺ちゃん", Age = 70, Sex = "男" },
    new { Name = "曾婆ちゃん", Age = 100, Sex = "女" },
    new { Name = "曾曾婆ちゃん", Age = 125, Sex = "女" }
};

string startVal = string.Empty;
var AggNamePerSex = from f in family
                    group f by f.Sex into g
                    select new {
                        Sex = g.Key,
                        AggName = g.Aggregate(
                            startVal // 初期値
                            , (running, next) => running += next.Name + "," // 集計処理
                            , result => result == string.Empty ? result : result.Substring(0, result.Length -1) // 終了処理
                        )
                    };

foreach (var sexGroup in AggNamePerSex)
{
    Console.WriteLine(sexGroup.Sex + " : " + sexGroup.AggName);
}

実行結果はこんな感じ

男 : 父,爺ちゃん
女 : 母,娘,曾婆ちゃん,曾曾婆ちゃん

処理の方をよく見てみると、初期値(初期化)→集計処理→終了処理 とOracleやSQL Serverと似ていますね。パラレル実行などがないため、マージはありませんが(w

 

P.S. ソースを見てみると、もはやC#のソースに見えない…というか、なぜ「C」って付いているんだろうw

posted @ 2:05 | Feedback (0)