C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[4]: C# リストデータの集計


(過去ログ 127 を表示中)

[トピック内 5 記事 (1 - 5 表示)]  << 0 >>

■75656 / inTopicNo.1)  C# リストデータの集計
  
□投稿者/ 集計見習い (1回)-(2015/04/20(Mon) 22:43:26)

分類:[C#] 


C#2010を使用して下記のような表を集計する処理を作成しております。

○集計内容
IPアドレス、イベントIDごとに集計を行い、最新日時のデータのフラグ値を確認する。

最近はラムダ式、Delegate等に凝っていて、簡単な結合や並び替えはできるようになったんですが、
このようなちょっと複雑な集計はお手上げ状態です。

各一列ごとに対応するプロパティをもつクラスを作って、
そのクラスのリストを作ってラムダ式で集計できればと思います。
どなたかわかる方教えてくだされば幸いです。

○クラス例
public class RecoadData
{
public DateTime IventTime { set; get; }
public string IPAddress { set; get; }
public int IventID { set; get; }
public int Flg { set; get; }
}


○集計前データ例
日時 IPアドレス イベントID フラグ
2015/3/3 192.168.1.2 1 1
2015/1/20 192.168.1.1 4 1
2015/2/27 192.168.1.2 4 1
2014/7/17 192.168.1.3 2 1
2014/7/29 192.168.1.1 3 1
2014/4/7 192.168.1.1 1 1
2014/11/25 192.168.1.2 2 1
2014/4/1 192.168.1.1 1 0
2014/8/16 192.168.1.3 2 0
2014/6/16 192.168.1.2 4 0
2014/7/28 192.168.1.3 3 0
2014/6/6 192.168.1.1 4 0
2014/4/21 192.168.1.2 2 0
2014/12/23 192.168.1.3 1 0
2014/7/24 192.168.1.1 3 0
2014/10/11 192.168.1.2 1 0
2014/11/18 192.168.1.3 4 0
2014/9/24 192.168.1.3 1 0
...以下略

○集計後データ例
最新日時 IPアドレス イベントID フラグ
2015/4/1 192.168.1.1 1 0
2015/4/2 192.168.1.1 2 1
2015/4/3 192.168.1.1 3 0
2015/4/4 192.168.1.1 4 1
2015/4/5 192.168.1.2 1 0
2015/4/6 192.168.1.2 2 1
2015/4/7 192.168.1.2 3 0
2015/4/8 192.168.1.2 4 1
2015/4/9 192.168.1.3 1 0
2015/4/10 192.168.1.3 2 1
2015/4/11 192.168.1.3 3 0
2015/4/12 192.168.1.3 4 1


引用返信 編集キー/
■75658 / inTopicNo.2)  Re[1]: C# リストデータの集計
□投稿者/ 魔界の仮面弁士 (297回)-(2015/04/21(Tue) 10:53:38)
No75656 (集計見習い さん) に返信
> public class RecoadData
> {
> public DateTime IventTime { set; get; }

もしかして:
 RecoadData.IventTime
→RecordData.EventTime



> IPアドレス、イベントIDごとに集計を行い、最新日時のデータのフラグ値を確認する。

元データは 2014/04/01〜2015/03/03 のデータなのに、
集計結果は 2015/04/01〜2015/04/12 になっていて、
サンプルの意味を成していないようです……。

設問と集計例が合致するようにして、もう一度説明して頂けませんか?


とりあえず設問通りに解釈すると、各パイプラインは次の流れになりそうですが:


=========================================
(1) IPアドレス、イベントIDごとに集計する
-----------------------------------------
【IP = 192.168.1.1】【ID = 1】
  《日付 = 2014/04/07》《フラグ = 1》
  《日付 = 2014/04/01》《フラグ = 0》
【IP = 192.168.1.1】【ID = 3】
  《日付 = 2014/07/29》《フラグ = 1》
  《日付 = 2014/07/24》《フラグ = 0》
【IP = 192.168.1.1】【ID = 4】
  《日付 = 2015/01/20》《フラグ = 1》
  《日付 = 2014/06/06》《フラグ = 0》

【IP = 192.168.1.2】【ID = 1】
  《日付 = 2015/03/03》《フラグ = 1》
  《日付 = 2014/10/11》《フラグ = 0》
【IP = 192.168.1.2】【ID = 2】
  《日付 = 2014/11/25》《フラグ = 1》
  《日付 = 2014/04/21》《フラグ = 0》
【IP = 192.168.1.2】【ID = 4】
  《日付 = 2015/02/27》《フラグ = 1》
  《日付 = 2014/06/16》《フラグ = 0》

【IP = 192.168.1.3】【ID = 1】
  《日付 = 2014/12/23》《フラグ = 0》
  《日付 = 2014/09/24》《フラグ = 0》
【IP = 192.168.1.3】【ID = 2】
  《日付 = 2014/07/17》《フラグ = 1》
  《日付 = 2014/08/16》《フラグ = 0》
【IP = 192.168.1.3】【ID = 3】
  《日付 = 2014/07/28》《フラグ = 0》
【IP = 192.168.1.3】【ID = 4】
  《日付 = 2014/11/18》《フラグ = 0》


=========================================
(2) 各グループの最新日時を抽出
-----------------------------------------
【IP = 192.168.1.1】 【ID = 1】  《日付 = 2014/04/07》 《フラグ = 1》
【IP = 192.168.1.1】 【ID = 3】  《日付 = 2014/07/29》 《フラグ = 1》
【IP = 192.168.1.1】 【ID = 4】  《日付 = 2015/01/20》 《フラグ = 1》
【IP = 192.168.1.2】 【ID = 1】  《日付 = 2015/03/03》 《フラグ = 1》
【IP = 192.168.1.2】 【ID = 2】  《日付 = 2014/11/25》 《フラグ = 1》
【IP = 192.168.1.2】 【ID = 4】  《日付 = 2015/02/27》 《フラグ = 1》
【IP = 192.168.1.3】 【ID = 1】  《日付 = 2014/12/23》 《フラグ = 0》
【IP = 192.168.1.3】 【ID = 2】  《日付 = 2014/08/16》 《フラグ = 0》
【IP = 192.168.1.3】 【ID = 3】  《日付 = 2014/07/28》 《フラグ = 0》
【IP = 192.168.1.3】 【ID = 4】  《日付 = 2014/11/18》 《フラグ = 0》


=========================================
(3) 最新日時、IP、ID 順に並び替え
-----------------------------------------
 最新日時  IPアドレス  ID  フラグ
2014/04/07  192.168.1.1   1  1
2014/07/28  192.168.1.3   3  0
2014/07/29  192.168.1.1   3  1
2014/08/16  192.168.1.3   2  0
2014/11/18  192.168.1.3   4  0
2014/11/25  192.168.1.2   2  1
2014/12/23  192.168.1.3   1  0
2015/01/20  192.168.1.1   4  1
2015/02/27  192.168.1.2   4  1
2015/03/03  192.168.1.2   1  1
引用返信 編集キー/
■75659 / inTopicNo.3)  Re[2]: C# リストデータの集計
□投稿者/ 魔界の仮面弁士 (298回)-(2015/04/21(Tue) 10:59:46)
No75658 (魔界の仮面弁士) に追記
> とりあえず設問通りに解釈すると、各パイプラインは次の流れになりそうですが:

上記をクエリ構文で書いてみました。

var q = from r in CreateSampleData()
    /* ↓ (1) IPアドレス、イベントIDごとに集計する ↓ */
    group new { r.IventTime, r.Flg } by new { r.IPAddress, r.IventID } into g
    /* ↑ (1) IPアドレス、イベントIDごとに集計する ↑ */

    /* ↓ (2) 各グループの最新日時を抽出 ↓ */
    let Value = (from p in g
                orderby p.IventTime descending
                select new { p.IventTime, p.Flg }).FirstOrDefault()
    /* ↑(2) 各グループの最新日時を抽出↑ */
    let record = new
    {
        g.Key.IPAddress,
        g.Key.IventID,
        Value.IventTime,
        Value.Flg
    }
    /* ↓ (3) 最新日時、IP、ID 順に並び替え↓  */
    orderby record.IventTime, record.IPAddress, record.IventID
    select record;
    /* ↑(3) 最新日時、IP、ID 順に並び替え↑ */

// 内容確認
dataGridView1.DataSource = q.ToArray();

引用返信 編集キー/
■75660 / inTopicNo.4)  Re[3]: C# リストデータの集計
□投稿者/ 魔界の仮面弁士 (299回)-(2015/04/21(Tue) 11:13:05)
No75659 (魔界の仮面弁士) に追記
> ■No75658 (魔界の仮面弁士) に追記
>>とりあえず設問通りに解釈すると、各パイプラインは次の流れになりそうですが:
> 上記をクエリ構文で書いてみました。

今度はメソッド構文で:

var q = CreateSampleData()
        .GroupBy(r => new { r.IPAddress, r.IventID })
        .Select(r => new {r.Key, Value = r.OrderByDescending(p => p.IventTime).First() })
        .OrderBy(r => r.Value.IventTime).ThenBy(r =>r.Key)
        .Select(r => new {
            r.Value.IventTime,
            r.Key.IPAddress,
            r.Key.IventID,
            r.Value.Flg
        });

// 内容確認
dataGridView1.DataSource = q.ToArray();

引用返信 編集キー/
■75682 / inTopicNo.5)  Re[4]: C# リストデータの集計
□投稿者/ 集計見習い (2回)-(2015/04/22(Wed) 22:31:35)
すみません、説明が悪くて申し訳ありません。

わかりやすい解説ありがとうございます。
ラムダ式を使いこなせるときれいで短い構文ができるんですね。
私もラムダ式を早くマスターして、
ことあるごとにFor文乱立からおさらばしたいです。


解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -