SlideShare a Scribd company logo
1 of 52
Download to read offline
Let’s LINQing!
- C#におけるデータ処理 -
2017/3/25 - #nds51
TAKANO Sho(高野 将)/ @masaru_b_cl
某SIerで働くDeveloper
そのかたわら執筆業も
自己紹介
#nds51 2
自己紹介
NDS初期メンバーの一人
#nds51 3
自己紹介
最近の参加状況
#nds51 4
自己紹介
最近の参加状況
#nds51 5
なんと2年ぶり!
自己紹介
最近の参加状況
#nds51 6
なんと2年ぶり!
不甲斐ない限り……
自己紹介
#nds51 7
Niigata.NET https://ngtnet.connpass.com/ 発起人
Agenda
Introduction to LINQ
LINQ by Example
FAQ
#nds51 8
Introduction to LINQ
LINQとはなにか?
#nds51 9
LINQとは?
Language-Integrated Query (LINQ) is an innovation introduced in
the .NET Framework version 3.5 that bridges the gap between the
world of objects and the world of data.
#nds51 10
❞
統合言語クエリ (LINQ: Language-Integrated Query) は、Visual Studio
2008 および .NET Framework Version 3.5 の革新的な機能で、オブジェ
クトの世界とデータの世界の間の橋渡しをするものです。
Introduction to LINQ (C#)
https://msdn.microsoft.com/ja-jp/library/mt693042.aspx
#nds51 11
おまえは何を言っているんだ?
私の理解
あらゆるデータソースに
ほぼ同じようなコードで
クエリ(問い合わせ)発行
#nds51 12
Query for Anything
LINQ
CSV
XML
etc…
RDBMS
KVS
Excel
#nds51 13
例えば
こんなCSVファイルがあったとしましょう
#nds51 14
2017年分を日付の降順で
こんな感じでまっすぐなデータにしてやって
#nds51 15
var dataSource = File.ReadLines("traditional_syukujitsu.csv", Encoding.GetEncoding(932))
.Select(line => line.Split(','))
.Select(items => new [] {
(Name: items[0], RawDate: items[1]),
(Name: items[2], RawDate: items[3]),
(Name: items[4], RawDate: items[5])
})
.SelectMany(entries => entries)
.Where(entry => DateTime.TryParse(entry.RawDate, out var _))
.Select(entry => (Date: DateTime.Parse(entry.RawDate), Name: entry.Name));
2017年分を日付の降順で
あとは絞り込んで、並び替えて、書式指定
#nds51 16
dataSource
.Where(h => h.Date >= new DateTime(2017, 1, 1)) // 絞り込み(filter)
.Where(h => h.Date <= new DateTime(2017, 12, 31)) // 絞り込み(filter)
.OrderByDescending(h => h.Date) // 並べ替え(sort)
.Select(h => $“{h.Date:yyyy/MM/dd} ( {h.Name} )”); // 書式指定(map)
2017年分を日付の降順で
できた!
#nds51 17
他にも
こんなCSVファイルがあったとしましょう
#nds51 18
国民の祝日について - 内閣府
http://www8.cao.go.jp/chosei/shukujitsu/gaiyou.html
var dataSource = File.ReadLines("syukujitsu.csv", Encoding.GetEncoding(932))
.Select(line => line.Split(','))
.Skip(1)
.Select(items => (Date: DateTime.Parse(items[0]), Name: items[1]));
dataSource
.Where(h => h.Date >= new DateTime(2017, 1, 1))
.Where(h => h.Date <= new DateTime(2017, 12, 31))
.OrderByDescending(h => h.Date)
.Select(h => $"{h.Date:yyyy/MM/dd} ( {h.Name} )");
他にも
#nds51 19
他にも
#nds51 20
var dataSource = File.ReadLines("syukujitsu.csv", Encoding.GetEncoding(932))
.Select(line => line.Split(','))
.Skip(1)
.Select(items => (Date: DateTime.Parse(items[0]), Name: items[1]));
dataSource
.Where(h => h.Date >= new DateTime(2017, 1, 1))
.Where(h => h.Date <= new DateTime(2017, 12, 31))
.OrderByDescending(h => h.Date)
.Select(h => $"{h.Date:yyyy/MM/dd} ( {h.Name} )");
ひとつ前と
完全に一致
XMLも
#nds51 21
var dataSource = XDocument.Load("Holidays.xml")
.Descendants("Holiday")
.Select(element =>
(
Date: DateTime.Parse(element.Element("Date").Value),
Name: element.Element("Name").Value
)
);
dataSource
.Where(h => h.Date >= new DateTime(2017, 1, 1))
.Where(h => h.Date <= new DateTime(2017, 12, 31))
.OrderByDescending(h => h.Date)
.Select(h => $"{h.Date:yyyy/MM/dd} ( {h.Name} )");
XMLも
#nds51 22
LINQ to XML
https://msdn.microsoft.com/ja-jp/library/bb387098.aspx
Excelも
#nds51 23
var dataSource = new XLWorkbook("syukujitsu.xlsx")
.Worksheet(1)
.Rows()
.Skip(1)
.Select(row => (Date: (DateTime)row.Cell(1).Value, Name: row.Cell(2).Value as string));
dataSource
.Where(h => h.Date >= new DateTime(2017, 1, 1))
.Where(h => h.Date <= new DateTime(2017, 12, 31))
.OrderByDescending(h => h.Date)
.Select(h => $"{h.Date:yyyy/MM/dd} ( {h.Name} )");
Excelも
#nds51 24
ClosedXML
https://github.com/closedxml/closedxml
SQLiteも
#nds51 25
var dataSource = new DataContext(new SQLiteConnection("Data Source=nds51.db"))
.GetTable<Holiday>();
dataSource
.Where(h => h.Date >= new DateTime(2017, 1, 1))
.Where(h => h.Date <= new DateTime(2017, 12, 31))
.OrderByDescending(h => h.Date)
.Select(h => $"{h.Date:yyyy/MM/dd} ( {h.Name} )");
SQLiteも
#nds51 26
[Table(Name="Holiday")]
class Holiday
{
[Column]
public DateTime Date { get; set; }
[Column]
public string Name { get; set; }
}
System.Data.SQLite
https://system.data.sqlite.org/index.html
Redisも
#nds51 27
var dataSource = new (
await new RedisList<Holiday>(
new RedisSettings("127.0.0.1"),"holidays“
)
.Range()
)
.Select(holiday => (
Date: holiday.Date.ToLocalTime(), // RedisはUnixTime(UTC)なので、JSTに変換
Name: holiday.Name
));
dataSource
.Where(h => h.Date >= new DateTime(2017, 1, 1))
.Where(h => h.Date <= new DateTime(2017, 12, 31))
.OrderByDescending(h => h.Date)
.Select(h => $"{h.Date:yyyy/MM/dd} ( {h.Name} )");
Redisも
#nds51 28
class Holiday
{
public DateTime Date { get; set; }
public string Name { get; set; }
}
CloudStructures
https://github.com/neuecc/CloudStructures
お分かりただけただろうか…?
LINQ
CSV
XML
etc…
RDBMS
KVS
Excel
#nds51 29
LINQ by Example
LINQの実例
#nds51 30
お題
某企業の新入社員研修にて、
それぞれの課題ごとに
実績日数の傾向を確認したい
#nds51 31
こんなデータがありまして
#nds51 32
やること
カテゴリ、課題ごとに以下を集計
最小値
最大値
平均
標準偏差
#nds51 33
第1段階
生データを集計しやすい形に整形する
#nds51 34
第2段階
データを集計して各種の基本的な統計値を取得する
#nds51 35
第3段階
ばらつきの大きい課題の傾向を把握するため、
標準偏差で並び替える
#nds51 36
第4段階
カテゴリごとにばらつきの傾向を確認するため、
標準偏差の平均をとる
#nds51 37
第5段階以降も同様に
知りたい指標に合わせて
好きなだけデータをいじれる!
#nds51 38
FAQ
よくある質問
#nds51 39
Q. それってExcelでもできるのでは?
#nds51 40
Q. それってExcelでもできるのでは?
A. できます!
#nds51 41
Q. それってExcelでもできるのでは?
A. ただし…
あらゆるデータソースに対してできる?
リアルタイムにできる?
というような利点があります
(もちろんExcelでもがんばればできる)
#nds51 42
Q. それってPandasでもできるのでは?
#nds51 43
※Pandas
Python製のデータ解析ライブラリ。強い。
Q. それってPandasでもできるのでは?
#nds51 44
ジョジョの奇妙な冒険
第三部(スターダストクルセイダース)
第42話 ダービー・ザ・プレイヤーその3 より
A. Exactly!
(その通りでございます)
Q. それってPandasでもできるのでは?
#nds51 45
A. ただし…
使い慣れたツール(C#+LINQ)でやるのは、
間違いとは言い切れない
チームのスキルなどと相談すること
Q. どういう仕組みで動いてるの?
#nds51 46
Q. どういう仕組みで動いてるの?
A. イテレーターパターンと
デコレーターパターンの合わせ技
#nds51 47
Q. どういう仕組みで動いてるの?
イテレーター:値を列挙する
IEnumerable<T>
IEnumerator<T>を取得する
IEnumerator<T>
T型の値を列挙する
bool MoveNext()
T Current { get; }
#nds51 48
Q. どういう仕組みで動いてるの?
デコレーター
IEnumerable<T>に対する拡張メソッド
例)
IEnumerable<TResult> Select<TSource, TResult>(
this IEnumerable<TSource> source,
Func<T, TResult> selector)
#nds51 49
Q. どういう仕組みで動いてるの?
何らかのコレクションをIEnumerable<T>にできれば、
あとは標準クエリ演算子等を組み合わせてやるだけ
#nds51 50
Select(射影)
Aggregate(畳み込み)
SelectMany(射影と平滑化)
Where(絞り込み)
OrderyBy(並び替え)
まとめ
#nds51 51
まとめ
C#でデータ処理するならまずはLINQ
LINQを使うとあらゆるデータソースのデータを
柔軟に変換したり集計できる
IEnumerable<T>で列挙できればOK
#nds51 52

More Related Content

Similar to Let's LINQing! - C#におけるデータ処理 - by @masaru_b_cl #nds51

Elastic circle ci-co-webinar-20210127
Elastic circle ci-co-webinar-20210127Elastic circle ci-co-webinar-20210127
Elastic circle ci-co-webinar-20210127Shotaro Suzuki
 
BPStudy32 CouchDB 再入門
BPStudy32 CouchDB 再入門BPStudy32 CouchDB 再入門
BPStudy32 CouchDB 再入門Yohei Sasaki
 
つくってあそぼ ラムダ計算インタプリタ
つくってあそぼ ラムダ計算インタプリタつくってあそぼ ラムダ計算インタプリタ
つくってあそぼ ラムダ計算インタプリタ京大 マイコンクラブ
 
とある制作会社の目次索引作成技法
とある制作会社の目次索引作成技法とある制作会社の目次索引作成技法
とある制作会社の目次索引作成技法Kenshi Muto
 
Rを用いた外国語教育データの整理・要約
Rを用いた外国語教育データの整理・要約Rを用いた外国語教育データの整理・要約
Rを用いた外国語教育データの整理・要約Yusaku Kawaguchi
 
データとは何か
データとは何かデータとは何か
データとは何かKenta Suzuki
 
10分で分かるr言語入門ver2.14 15 0905
10分で分かるr言語入門ver2.14 15 090510分で分かるr言語入門ver2.14 15 0905
10分で分かるr言語入門ver2.14 15 0905Nobuaki Oshiro
 
LINQ 概要 + 結構便利な LINQ to XML
LINQ 概要 + 結構便利な LINQ to XMLLINQ 概要 + 結構便利な LINQ to XML
LINQ 概要 + 結構便利な LINQ to XMLShinichiAoyagi
 
SQL Server のインデックス設計
SQL Server のインデックス設計SQL Server のインデックス設計
SQL Server のインデックス設計Koji Yamada
 
プログラマのための文書推薦入門
プログラマのための文書推薦入門プログラマのための文書推薦入門
プログラマのための文書推薦入門y-uti
 
Webアプリを並行開発する際のマイグレーション戦略
Webアプリを並行開発する際のマイグレーション戦略Webアプリを並行開発する際のマイグレーション戦略
Webアプリを並行開発する際のマイグレーション戦略Takayuki Shimizukawa
 
ElixirでIoT 第2回 「環境センシングとデータ表示を サクっと?やってみた」
ElixirでIoT 第2回「環境センシングとデータ表示をサクっと?やってみた」ElixirでIoT 第2回「環境センシングとデータ表示をサクっと?やってみた」
ElixirでIoT 第2回 「環境センシングとデータ表示を サクっと?やってみた」Hideki Takase
 
K010 appstat201201
K010 appstat201201K010 appstat201201
K010 appstat201201t2tarumi
 
実践 Reactive Extensions
実践 Reactive Extensions実践 Reactive Extensions
実践 Reactive ExtensionsShin Ise
 
Presto As A Service - Treasure DataでのPresto運用事例
Presto As A Service - Treasure DataでのPresto運用事例Presto As A Service - Treasure DataでのPresto運用事例
Presto As A Service - Treasure DataでのPresto運用事例Taro L. Saito
 
Fess/Elasticsearchを使った業務で使える?全文検索への道
Fess/Elasticsearchを使った業務で使える?全文検索への道Fess/Elasticsearchを使った業務で使える?全文検索への道
Fess/Elasticsearchを使った業務で使える?全文検索への道Shinsuke Sugaya
 

Similar to Let's LINQing! - C#におけるデータ処理 - by @masaru_b_cl #nds51 (20)

Elastic circle ci-co-webinar-20210127
Elastic circle ci-co-webinar-20210127Elastic circle ci-co-webinar-20210127
Elastic circle ci-co-webinar-20210127
 
BPStudy32 CouchDB 再入門
BPStudy32 CouchDB 再入門BPStudy32 CouchDB 再入門
BPStudy32 CouchDB 再入門
 
つくってあそぼ ラムダ計算インタプリタ
つくってあそぼ ラムダ計算インタプリタつくってあそぼ ラムダ計算インタプリタ
つくってあそぼ ラムダ計算インタプリタ
 
とある制作会社の目次索引作成技法
とある制作会社の目次索引作成技法とある制作会社の目次索引作成技法
とある制作会社の目次索引作成技法
 
Heroku Postgres
Heroku PostgresHeroku Postgres
Heroku Postgres
 
Heroku Postgres
Heroku PostgresHeroku Postgres
Heroku Postgres
 
Rを用いた外国語教育データの整理・要約
Rを用いた外国語教育データの整理・要約Rを用いた外国語教育データの整理・要約
Rを用いた外国語教育データの整理・要約
 
データとは何か
データとは何かデータとは何か
データとは何か
 
10分で分かるr言語入門ver2.14 15 0905
10分で分かるr言語入門ver2.14 15 090510分で分かるr言語入門ver2.14 15 0905
10分で分かるr言語入門ver2.14 15 0905
 
The History of LINQ
The History of LINQThe History of LINQ
The History of LINQ
 
LINQ 概要 + 結構便利な LINQ to XML
LINQ 概要 + 結構便利な LINQ to XMLLINQ 概要 + 結構便利な LINQ to XML
LINQ 概要 + 結構便利な LINQ to XML
 
SQL Server のインデックス設計
SQL Server のインデックス設計SQL Server のインデックス設計
SQL Server のインデックス設計
 
プログラマのための文書推薦入門
プログラマのための文書推薦入門プログラマのための文書推薦入門
プログラマのための文書推薦入門
 
Webアプリを並行開発する際のマイグレーション戦略
Webアプリを並行開発する際のマイグレーション戦略Webアプリを並行開発する際のマイグレーション戦略
Webアプリを並行開発する際のマイグレーション戦略
 
ElixirでIoT 第2回 「環境センシングとデータ表示を サクっと?やってみた」
ElixirでIoT 第2回「環境センシングとデータ表示をサクっと?やってみた」ElixirでIoT 第2回「環境センシングとデータ表示をサクっと?やってみた」
ElixirでIoT 第2回 「環境センシングとデータ表示を サクっと?やってみた」
 
K010 appstat201201
K010 appstat201201K010 appstat201201
K010 appstat201201
 
20071204
2007120420071204
20071204
 
実践 Reactive Extensions
実践 Reactive Extensions実践 Reactive Extensions
実践 Reactive Extensions
 
Presto As A Service - Treasure DataでのPresto運用事例
Presto As A Service - Treasure DataでのPresto運用事例Presto As A Service - Treasure DataでのPresto運用事例
Presto As A Service - Treasure DataでのPresto運用事例
 
Fess/Elasticsearchを使った業務で使える?全文検索への道
Fess/Elasticsearchを使った業務で使える?全文検索への道Fess/Elasticsearchを使った業務で使える?全文検索への道
Fess/Elasticsearchを使った業務で使える?全文検索への道
 

More from 将 高野

新入社員研修の作り方 〜完全版〜 by @masaru_b_cl #nds57
新入社員研修の作り方 〜完全版〜 by @masaru_b_cl #nds57新入社員研修の作り方 〜完全版〜 by @masaru_b_cl #nds57
新入社員研修の作り方 〜完全版〜 by @masaru_b_cl #nds57将 高野
 
新しい世界の学び方 by @masaru_b_cl #nds55
新しい世界の学び方 by @masaru_b_cl #nds55新しい世界の学び方 by @masaru_b_cl #nds55
新しい世界の学び方 by @masaru_b_cl #nds55将 高野
 
C#でアプリを作ってみよう! #ngtnet
C#でアプリを作ってみよう! #ngtnetC#でアプリを作ってみよう! #ngtnet
C#でアプリを作ってみよう! #ngtnet将 高野
 
業務アプリケーション開発を支える.NET技術 #ngtnet
業務アプリケーション開発を支える.NET技術 #ngtnet業務アプリケーション開発を支える.NET技術 #ngtnet
業務アプリケーション開発を支える.NET技術 #ngtnet将 高野
 
仕事が捗る! Office & エディター操作入門 #nds40
仕事が捗る! Office & エディター操作入門 #nds40仕事が捗る! Office & エディター操作入門 #nds40
仕事が捗る! Office & エディター操作入門 #nds40将 高野
 
OWIN - .NETにおけるPSGI -
OWIN - .NETにおけるPSGI -OWIN - .NETにおけるPSGI -
OWIN - .NETにおけるPSGI -将 高野
 
設計(≒デザイン)の話をしよう #nds35
設計(≒デザイン)の話をしよう #nds35設計(≒デザイン)の話をしよう #nds35
設計(≒デザイン)の話をしよう #nds35将 高野
 
Lightweight C#
Lightweight C#Lightweight C#
Lightweight C#将 高野
 
はじめてのReleaseブランチ運用(svn編)
はじめてのReleaseブランチ運用(svn編)はじめてのReleaseブランチ運用(svn編)
はじめてのReleaseブランチ運用(svn編)将 高野
 
Tddのすゝめ
TddのすゝめTddのすゝめ
Tddのすゝめ将 高野
 
効率10倍UP 秀丸IDE化法
効率10倍UP 秀丸IDE化法効率10倍UP 秀丸IDE化法
効率10倍UP 秀丸IDE化法将 高野
 
Lets Enjoy C#!
Lets Enjoy C#!Lets Enjoy C#!
Lets Enjoy C#!将 高野
 
Hello ".NET" World
Hello ".NET" WorldHello ".NET" World
Hello ".NET" World将 高野
 

More from 将 高野 (16)

新入社員研修の作り方 〜完全版〜 by @masaru_b_cl #nds57
新入社員研修の作り方 〜完全版〜 by @masaru_b_cl #nds57新入社員研修の作り方 〜完全版〜 by @masaru_b_cl #nds57
新入社員研修の作り方 〜完全版〜 by @masaru_b_cl #nds57
 
新しい世界の学び方 by @masaru_b_cl #nds55
新しい世界の学び方 by @masaru_b_cl #nds55新しい世界の学び方 by @masaru_b_cl #nds55
新しい世界の学び方 by @masaru_b_cl #nds55
 
C#でアプリを作ってみよう! #ngtnet
C#でアプリを作ってみよう! #ngtnetC#でアプリを作ってみよう! #ngtnet
C#でアプリを作ってみよう! #ngtnet
 
業務アプリケーション開発を支える.NET技術 #ngtnet
業務アプリケーション開発を支える.NET技術 #ngtnet業務アプリケーション開発を支える.NET技術 #ngtnet
業務アプリケーション開発を支える.NET技術 #ngtnet
 
仕事が捗る! Office & エディター操作入門 #nds40
仕事が捗る! Office & エディター操作入門 #nds40仕事が捗る! Office & エディター操作入門 #nds40
仕事が捗る! Office & エディター操作入門 #nds40
 
OWIN - .NETにおけるPSGI -
OWIN - .NETにおけるPSGI -OWIN - .NETにおけるPSGI -
OWIN - .NETにおけるPSGI -
 
設計(≒デザイン)の話をしよう #nds35
設計(≒デザイン)の話をしよう #nds35設計(≒デザイン)の話をしよう #nds35
設計(≒デザイン)の話をしよう #nds35
 
Lightweight C#
Lightweight C#Lightweight C#
Lightweight C#
 
はじめてのReleaseブランチ運用(svn編)
はじめてのReleaseブランチ運用(svn編)はじめてのReleaseブランチ運用(svn編)
はじめてのReleaseブランチ運用(svn編)
 
git-svn
git-svngit-svn
git-svn
 
GTD on RTM
GTD on RTMGTD on RTM
GTD on RTM
 
Tddのすゝめ
TddのすゝめTddのすゝめ
Tddのすゝめ
 
効率10倍UP 秀丸IDE化法
効率10倍UP 秀丸IDE化法効率10倍UP 秀丸IDE化法
効率10倍UP 秀丸IDE化法
 
Choi LINQ
Choi LINQChoi LINQ
Choi LINQ
 
Lets Enjoy C#!
Lets Enjoy C#!Lets Enjoy C#!
Lets Enjoy C#!
 
Hello ".NET" World
Hello ".NET" WorldHello ".NET" World
Hello ".NET" World
 

Let's LINQing! - C#におけるデータ処理 - by @masaru_b_cl #nds51