わんくま同盟 東京勉強会 #21 R流・ C#3.0 LINQ とラムダ式で遊ぼ う Microsoft MVP for Development Tools - Visual C# (April 2007 - March 2009) 2008 年 06 月 21 日 R ・田中一郎

Slides:



Advertisements
Similar presentations
ユーザ定義演算子による 内部 DSL の構成法 市川 和央 千葉 滋 東京工業大学大学院 1. Domain Specific Language (DSL) 用途に応じたミニ言語 select name from register where age < 30 SQL hello : hello.c.
Advertisements

本プレゼンテーション ( 以下、本書 ) で提供されている情報は、本書が 発表された時点における Microsoft の見解を述べたものです。市場 ニーズの変化に対応する必要があるため、本書は記載された内容の実 現に関する Microsoft の確約とはみなされないものとします。また本 書に記載された情報の正確さについて、保証するものではありません。
WebサービスII (第12回)‏ 2007年12月19日 植田龍男.
.NET Framework 4.0 世代の Expression Trees
Microsoft MVP for Development Tools - Visual C#
Microsoft MVP for Development Tools - Visual C#
Linqその効果的な使い方 えムナウ (児玉宏之)
Linqその効果的な使い方 えムナウ (児玉宏之)
アルゴリズムとデータ構造 2010年7月5日
6-2 データベース 1.SQLite SQLを単純化した SQLite を使ってデータベースを操作 表「fruit」
Javaのための暗黙的に型定義される構造体
C# 3.0をはじめよう!!.
C#によるWindowsFormApplication入門
とても使いやすい Boost の serialization
とても使いやすい Boost の serialization
Linq for VB はものすごい えムナウ (児玉宏之)
Linq for VB はものすごい えムナウ (児玉宏之)
T-SQL の Parse と Generate
はじめてのASP.NET 楽しいアプリ制作の会 #1 TWorks.
JSFによるWebアプリケーション開発 第6回
C# の現在・過去・未来 えムナウ (児玉宏之)
エンタープライズアプリケーション II 第7回 / 2006年7月9日
第20章 Flyweight ~同じものを共有して無駄をなくす~
アルゴリズムとデータ構造 2011年6月20日
第13回 ハッシュテーブルを使ったプログラム ~高速に検索するには?~.
第12回 2007年7月13日 応用Java (Java/XML).
プログラミング言語入門 手続き型言語としてのJava
Oracle XEを使ってみよう 初音玲.
0からわかるF# Part1 中 博俊 F# September 2008 CTP Base.
0からわかるF# Part1 中 博俊 F# September 2008 CTP Base.
オブジェクト指向 プログラミング 第十一回 知能情報学部 新田直也.
MVP for VB が語る C# 入門 初音 玲.
MVP for VB が語る C# 入門 初音 玲.
オブジェクト指向 プログラミング 第十三回 知能情報学部 新田直也.
第8回 2007年6月15日 応用Java (Java/XML).
静的型付きオブジェクト指向言語 のための 暗黙的に型定義されるレコード
暗黙的に型付けされる構造体の Java言語への導入
わんくま同盟・techbank.jp 夏椰 Insight Technology, Inc. 今川 美保
R流・C#マルチスレッドの復讐 2009年05月16日 R・田中一郎
アルゴリズムとデータ構造1 2006年7月4日
0からわかるF# Part1 中 博俊 F# September 2008 CTP Base.
C# の現在・過去・未来 えムナウ (児玉宏之)
データベースアクセス技術 ADO.NET 2.0 開発者カテゴリ ◆NOTES◆
0からわかるF# Part1 中 博俊 F# September 2008 CTP Base.
オブジェクト指向 プログラミング 第七回 知能情報学部 新田直也.
Null ヤバイのでなんとかする takeshik.
Null ヤバイのでなんとかする takeshik.
Java8について 2014/03/07.
Oracle XEを使ってみよう 初音玲.
もっと詳しくArrayクラスについて調べるには → キーワード検索
0からわかるF# Part1 中 博俊 F# September 2008 CTP Base.
0からわかるF# Part1 中 博俊 F# September 2008 CTP Base.
オブジェクト・プログラミング 第8回.
GUIプログラミングの基本=イベント イベントとは イベントの例 ウィンドウやウィンドウ内のパーツ(ボタン・スクロールバーなど)に発生する
アルゴリズムとプログラミング (Algorithms and Programming)
オブジェクト指向 プログラミング 第八回 知能情報学部 新田直也.
EntityManager と EJB QL EJB 3.0 コース 第8回 2006年8月5日.
System.AddInを利用したアプリケーション拡張 - アドインの開発 -
nativeの基礎知識 「ポインタ」てなによ!?
画面への描画 Graphics オブジェクト 紙 ペン Pen オブジェクト Brush オブジェクト 画面のピクセルをカプセル化
Action Method の実装 J2EE II 第9回 2004年12月2日.
アルゴリズムとデータ構造1 2009年7月2日
クラスの追加 メソッドの追加 TestCaseの追加 Test Methodの追加.
JAVA入門⑥ クラスとインスタンス.
How To WPF アプリケーション Part4 By 中博俊.
アルゴリズムとデータ構造 2012年6月21日
JSFによるWebアプリケーション開発 第7回
System.AddInを利用したアプリケーション拡張 - アドインの開発 -
応用Java(Java/XML) 第8回 2005年6月9日 植田龍男.
How To WPF アプリケーション Part3 By 中博俊.
Presentation transcript:

わんくま同盟 東京勉強会 #21 R流・ C#3.0 LINQ とラムダ式で遊ぼ う Microsoft MVP for Development Tools - Visual C# (April March 2009) 2008 年 06 月 21 日 R ・田中一郎

わんくま同盟 東京勉強会 #21 自己紹介 会員番号: 34 名前:R・田中一郎 所在:栃木県 年齢:18才 職業: 主に業務用 システムの開発 2005 年 11 月 Microsoft Visual Studio.NET デビュー。 この頃から R.Tanaka.Ichiro と名のりネットでアクティブに活動を始める。 2006 年 02 月 C# を学び始める。理想的な言語に感動。尊敬する方々の影響も大きい。 2006 年 09 月 わんくま同盟加盟 ある事件がきっかけで、中さんから声をかけていただき加盟。 2006 年 11 月 MSC2006 にて R・田中一郎として始めて人前に姿を晒す。 2007 年 04 月 Microsoft MVP for Visual Developer - Visual C# を受賞。 2007 年 06 月 わんくま同盟勉強会にてスピーカーデビュー。 2008 年 04 月 Microsoft MVP for Development Tools - Visual C# を受賞。 2008 年 05 月 , 試験をパス。 Microsoft Certified Technology Specialist for.Net Framework 2.0: Windows Applications 資格取得。

わんくま同盟 東京勉強会 #21 アジェンダ はじめに ラムダ式とは? ラムダ式で遊んでみる LINQ に欠かせないラムダ式 最後に

わんくま同盟 東京勉強会 #21 はじめに 本セッションの目的 ラムダ式やLINQで遊ぶこと で、 ラムダ式やLINQを理解して、 使いこなせるようになろう

わんくま同盟 東京勉強会 #21 ラムダ式とは? 匿名メソッドの記法 func f = ( x, y ) => x + y; 式ツリー型に代入できる Expression > e = ( x, y ) => x + y;

わんくま同盟 東京勉強会 #21 ラムダ式とは? - 匿名メソッドの記法について 通常のメソッド private int Method(int x, int y) { return x + y; } 匿名メソッド Func method = delegate(int x, int y) { return x + y; } ラムダ式 Func method = (int x, int y) => { return x + y; } Func method = (x, y) => x + y;

わんくま同盟 東京勉強会 #21 ラムダ式とは? - ラムダ式を使ってみる private void Plus() { this.Calculate((a, b) => a + b); } private void Subtract() { this.Calculate((a, b) => a - b); } private void Multiply() { this.Calculate((a, b) => a * b); } private void Divide() { this.Calculate((a, b) => a / b); } private void Calculate(Func func) { foreach(var x in this.Collection) { x.Result = func(x.Value1, x.Value2); Console.WriteLine(x.Result); }

わんくま同盟 東京勉強会 #21 ラムダ式とは? - 式ツリーについて public void Plus() { Expression > e = (a, b) => a + b; var bin = (BinaryExpression) e.Body; var v1 = (ParameterExpression) bin.Left; var v2 = (ParameterExpression) bin.Right; Console.WriteLine(e); // (a + b) Console.WriteLine(v1); // a Console.WriteLine(v2); // b this.Calculate(ex.Compile()); }

わんくま同盟 東京勉強会 #21 ラムダ式で遊ぼう!- Override Override を使った場合 class Base { public virtual int Method(int a, int b) {} } class HogeHoge { public override int Method(int a, int b) { return a + b; } ラムダ式を使って同じことを実現してみ る class Base { public Func Method; } class HogeHoge { public HogeHoge() { this.Method = (a, b) => a + b; }

わんくま同盟 東京勉強会 #21 ラムダ式で遊ぼう! - Template Method パターン public void Method(Action methodB) { this.MethodA(); methodB(); this.MethodC(); }

わんくま同盟 東京勉強会 #21 ラムダ式で遊ぼう! - Observer パターン public class Subject : INotifyPropertyChanged public event PropertyChangedEventHandler PropertyChanged; private int _Value = 0; public int Value { get { return this._Value; } set { if (this._Value == value) return; this._Value = value; if (PropertyChanged == null) return; PropertyChanged(this, new PropertyChangedEventArgs(“Value”)); } } public class Observer { public Observer() { var subject = new Subject(); subject.PropertyChanged += (sender, e) => MessageBox(“Changed!”); } }

わんくま同盟 東京勉強会 #21 ラムダ式で遊ぼう! - Strategy パターン (this.IsAdd ? new Action(this.AddData) : new Action(this.UpdateData))(); (this.IsAdd ? new Action(() => { ・・・追加処理 }) : new Action(() => { ・・・更新処理 }) ();

わんくま同盟 東京勉強会 #21 ラムダ式で遊ぼう! - コレクションに格納する var calc = new Dictionary >() { “Plus”,new Func ((a, b) => a + b), “Subtract,new Func ((a, b) => a - b), “Multiply “,new Func ((a, b) => a * b), “Divide”,new Func ((a, b) => a / b), } foreach(var x in this.Collection) { x.Result = calc[“Plus”](x.Value1, x.Value2); Console.WriteLine(x.Result); }

わんくま同盟 東京勉強会 #21 LINQ で遊ぼう!- LINQ to Objects(1) public Form1() { InitializeComponent(); var c = new[] { new { Code = 51, Name = “ ぽぴ王子 ”, Age = 18 }, new { Code = 34, Name = “R ・田中一郎 ”, Age = 18 }, new { Code = 111, Name = "IIJIMAS”. Age = 20 }}; var q1 = from x in c where x.Age == 18 select new { Code = x.Code, Name = x.Name }; var q2 = c.Where(x => x.Age == 18).Select(x => new { Code = x.Code, Name = x.Name }); var q3 = c. 条件 (x => x.Age == 18). 選択 (x => new { Code = x.Code, Name = x.Name }); listBox1.Binding(q1.ToArray(), "Code", "Name"); listBox2.Binding(q2.ToArray(), "Code", "Name"); listBox3.Binding(q3.ToArray(), "Code", "Name"); }

わんくま同盟 東京勉強会 #21 LINQ で遊ぼう!- LINQ to Objects(3) static void Binding( this ListControl x, object dataSource, string valueMember, string displayMember) { x.DataSource = dataSource; x.ValueMember = valueMember; x.DisplayMember = displayMember; } public static IEnumerable 条件 (this IEnumerable value, Func func) { var r = new List (); foreach(var x in value) if (func(x)) r.Add(x); return r; } public static IEnumerable 選択 (this IEnumerable value, Func func) { var r = new List (); foreach(var x in value) r.Add(func(x)); return r; }

わんくま同盟 東京勉強会 #21 LINQ で遊ぼう!- LINQ to HogeHoge(1) using System.Windows.Forms; using R.Tanaka.Ichiro.Linq.HogeHoge; //using System.Linq; namespace WindowsFormsApplication1 { public partial class LINQtoHogeHogeForm : Form { public LINQtoHogeHogeForm() { InitializeComponent(); using (var dt = new MemberDataSet.MemberDataTable()) { var q = from p in dt where p.Age == 18 select new { p.Code, p.Name }; this.grid.DataSource = q.ToList(); }

わんくま同盟 東京勉強会 #21 LINQ で遊ぼう!- LINQ to HogeHoge(2) using System; using System.Data; using System.Data.OleDb; using System.Data.Common; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; namespace R.Tanaka.Ichiro.Linq.HogeHoge { public static class LinqToHogeHoge { public static IEnumerable Where ( this IEnumerable value, Expression > lambdaExpression) { var dataTable = value as DataTable; var sql = GetSqlText(dataTable.TableName, lambdaExpression.Body); FillBySqlText(dataTable, sql); return dataTable.Rows.Cast (); } // インチキ SQL TEXT 生成ロジック // 実際は、各ノードのタイプに応じて再帰しながら条件式を組み立てるか、 // ソースのプロバイダのプロバイダの CreateQuery() メソッドを使う private static string GetSqlText(string tableName, Expression expressionBody) { return String.Format("SELECT * FROM {0} WHERE {1}", tableName, GetWhere(expressionBody)); }

わんくま同盟 東京勉強会 #21 LINQ で遊ぼう!- LINQ to HogeHoge(2) private static string GetWhere(Expression node) { var bin = node as BinaryExpression; var v1 = bin.Leftas MemberExpression; var v2 = bin.Rightas ConstantExpression; var op = bin.NodeType == ExpressionType.Equal? "=" : bin.NodeType == ExpressionType.GreaterThan? ">" : bin.NodeType == ExpressionType.LessThan? "<" : ""; // ・・・・・続く var v = v2.Value.ToString(); if (v2.Type.IsClass) v = "\'" + v + "\'"; return v1.Member.Name + op + v; } private static void FillBySqlText(DataTable dataTable, string sqlText) { using (var ad = new OleDbDataAdapter()) { var map = new DataTableMapping(); map.SourceTable = "Table"; map.DataSetTable = dataTable.TableName; foreach(DataColumn x in dataTable.Columns) map.ColumnMappings.Add(x.ColumnName, x.ColumnName); ad.TableMappings.Add(map); var cs = global::WindowsFormsApplication1.Properties.Settings.Default.MemberConnectionString; using (var cn = new OleDbConnection(cs)) { cn.Open();

わんくま同盟 東京勉強会 #21 LINQ で遊ぼう!- LINQ to HogeHoge(2) using (var cd = new OleDbCommand()) { cd.Connection= cn; cd.CommandText= sqlText; cd.CommandType= CommandType.Text; ad.SelectCommand = cd; dataTable.Clear(); ad.Fill(dataTable); } cn.Close(); } public static IEnumerable Select ( this IEnumerable value, Func func) { var r = new List (); foreach(var x in value) r.Add(func(x)); return r; } public static List ToList (this IEnumerable value) { var list = new List (); foreach(var x in value) list.Add(x); return list; }