@仕事 C# 
@個人活動 http://neue.cc/ @neuecchttps://github.com/neuecc/UniRx
神獄のヴァルハラゲート モンスタハンターロアオブカード 
http://gihyo.jp/dev/serial/01/grani/0001 
http://grani.jp/recruit
using
Windows 
WinForms, WPF 
Mac 
Xamarin.Mac 
Windows Tablet 
Windows Store Application 
WebApplication 
ASP.NET MVC/Web API, OWIN 
Cloud 
Microsoft Azure, AWS 
C# Everywhere 
Game 
Unity, PlayStation Mobile SDK 
Mobile 
Xamarin.iOS 
Xamarin.Android 
Windows Phone 8 SDK 
Embedded 
Windows Embedded 
.NET Micro Framework 
NUI 
Kinect, LeapMotion
Windows 
WinForms, WPF 
Mac 
Xamarin.Mac 
Windows Tablet 
Windows Store Application 
WebApplication 
ASP.NET MVC/WebAPI, OWIN 
Cloud 
Microsoft Azure, AWS 
C# Everywhere -Current 
Game 
Unity, PlayStation Mobile SDK 
Mobile 
Xamarin.iOS 
Xamarin.Android 
Windows Phone 8 SDK 
Embedded 
Windows Embedded 
.NET Micro Framework 
NUI 
Kinect, LeapMotion
Windows 
WinForms, WPF 
Mac 
Xamarin.Mac 
Windows Tablet 
Windows Store Application 
WebApplication 
ASP.NET MVC/WebAPI, OWIN 
Cloud 
Microsoft Azure, AWS 
C# Everywhere-Future 
Game 
Unity, PlayStation Mobile SDK 
Mobile 
Xamarin.iOS 
Xamarin.Android 
Windows Phone 8 SDK 
Embedded 
Windows Embedded 
.NET Micro Framework 
NUI 
Kinect, LeapMotion
サーバーもクライアントもC# 
同一ソリューションファイルに格納 
言語依存を強みに変える 
サーバーサイド(C#/ASP.NET)と 
クライアントサイド(Unity)でデータ共有
Introduction to LINQ
Java/Delphi 
Generics 
LINQ 
dynamic 
async 
2002 C# 1.0 
2005 C# 2.0 
2008 C# 3.0 
2010 C# 4.0 
2012 C# 5.0 
anonymous method 
yield return
Java/Delphi 
Generics 
LINQ 
dynamic 
async 
2002 C# 1.0 
2005 C# 2.0 
2008 C# 3.0 
2010 C# 4.0 
2012 C# 5.0 
anonymous method 
yield return 
C# 4.0以降Unity非対応の壁 
(本当にはよ対応して欲しい)
LINQ...
SQLみたいなもの?
似てる、半分正しい。 
varquery = fromx insource 
wherex % 2 == 0 
selectx * x;
Language INtegrated Query 
Unityでの実用上の場合は
// クエリ構文 
varquery = fromx insource 
wherex % 2 == 0 
selectx * x; 
// メソッド構文 
varquery = source 
.Where(x => x % 2 == 0) 
.Select(x => x * x);
// クエリ構文 
varquery = fromx insource 
wherex % 2 == 0 
selectx * x; 
// メソッド構文 
varquery = source 
.Where(x => x % 2 == 0) 
.Select(x => x * x); 
メソッド構文のほうが機能が多い(使えるメソッド 数が多い)&ラムダ式に慣れれば書きやすいので、 基本的にはメソッド構文で書くのをお薦めします 
(IntelliSenseでメソッドチェーン楽しい!)
// 列挙してフィルタリングして詰め直す varlist = newList<int>(); foreach(varitem insource) { if(item % 2 == 0) { list.Add(item); } } // 列挙してフィルタリングして詰め直す vararray = source.Where(x => x % 2 == 0).ToArray(); 
(source = IEnumerable<int>) 
・LINQは一行で済む 
・一時変数(List<T>)の宣言が不要 
・配列がカジュアルに使える
フィルタして変形して詰め直しは頻出パターン 
(pythonでのリスト内包表記とかに相当) // 列挙してフィルタリングして詰め直す // + 日付を足したのを加える varlist = newList<DateTime>(); foreach(varitem insource) { if(item % 2 == 0) { list.Add(DateTime.Now.AddDays(item)); } } // 列挙してフィルタリングして詰め直す // + 日付を足したのを加える vararray = source.Where(x => x % 2 == 0) .Select(x => DateTime.Now.AddDays(x)) .ToArray();
Takeの他にSkipとか条件つきの TakeWhile/SkipWhileなどもあるよ // 列挙してフィルタリングして詰め直す // + 日付を足したのを加える // を、4個分だけ取得する varlist = newList<DateTime>(); foreach(varitem insource) { if(item % 2 == 0) { list.Add(DateTime.Now.AddDays(item)); } if(list.Count == 4) break; } // 列挙してフィルタリングして詰め直す // + 日付を足したのを加える // を、4個分だけ取得する vararray = source.Where(x => x % 2 == 0) .Select(x => DateTime.Now.AddDays(x)) .Take(4) .ToArray();
値がかぶった時に別の値で比較する、というの もThenBy/ThenByDescendingでつなげるだけで 出来るのが普通のSortよりも強い // 列挙してフィルタリングして詰め直す // + 日付を足したのを加える // を、4個分だけ取得する // を、降順にソートする varlist = newList<DateTime>(); foreach(varitem insource) { if(item % 2 == 0) { list.Add(DateTime.Now.AddDays(item)); } if(list.Count == 4) break; } list.Sort((x, y) => -x.CompareTo(y)); // 列挙してフィルタリングして詰め直す // + 日付を足したのを加える // を、4個分だけ取得する // を、降順にソートする vararray = source.Where(x => x % 2 == 0) .Select(x => DateTime.Now.AddDays(x)) .Take(4) .OrderByDescending(x => x) .ToArray();
foreachでいい? 
機能が弱ければ弱いほどコードが意図を伝える 
単機能だからこそ、見ただけで何をやっているのか分かる。 それに加えて短く書けるが故に書きやすいし、そのこと自 体が読みやすさにも寄与する
合成可能であるということ 
C#はIntelliSense指向言語 
UnityもVisual Studioで書こう(少な くとも素エディタはやめよう)
In Unity
データソースを見つけよう 
Unityにおいて、例えば?
// Unityで活かせるLINQの底力!! (後編)からの引用 // http://gamesonytablet.blogspot.jp/2013/01/unitylinq_24.html// ターゲットに最も近い順で、5つのタグつきオブジェクトのレンダラのマテリアルを取得する varmaterials = GameObject.FindGameObjectsWithTag("sometag") .Select(r => r.renderer) .Where(r => r != null) .OrderBy(r => (r.transform.position -transform.position).sqrMagnitude) .Take(5) .SelectMany(r => r.materials) .ToList(); 
配列っぽいもの見つけたら、必ず何か使える。 
LINQで考える事が習慣化されれば、LINQ firstで発想は浮かぶ。
データソースを作り出す 
http://neue.cc/2014/11/11_482.html 
https://github.com/neuecc/LINQ-to-GameObject-for-Unity// 子孫方向の全ゲームオブジェクトのうちtagが"foobar"のオブジェクトを破壊 origin.Descendants().Where(x => x.tag == "foobar").Destroy(); // 自分を含む子ノードからBoxCollider2Dを抽出 varcolliders = origin.ChildrenAndSelf().OfComponent<BoxCollider2D>(); // 自分の真下にPrefabをCloneして追加 origin.Add(new[] { prefab, prefab, prefab });
死ぬin iOS 
http://neue.cc/2014/07/01_474.html 
だが使う https://www.assetstore.unity3d.com/jp/#!/content/18131
Deep Dive LINQ
内部挙動気になる人へ 
http://www.slideshare.net/neuecc/an-internal-of-linq-to-objects-29200657 
Topics
IObservable<T> 
IEnumerable<T> 
(LINQ to Objects) 
DataSet 
XML 
IQueryable 
SQL 
Twitter
IEnumerable<T> 
IObservable<T> 
(Reactive Extensions) 
UI 
(ReactiveProperty) 
OAuth 
(ReactiveOAuth) 
IQbservable<T> 
WMI
時間軸を基盤にしたLINQの新しい形 
Pushスタイル、IObservable<T> 
time 
間隔は不定期でも可 
終わりがなくてもいい(無限に続く)
DataSource 
(IEnumerable<T>) 
Action 
値の要求(Pull) 
DataSource 
(IObservable<T>) 
Action 
値の送信(Push)
LINQ to Asynchronous/Events 
http://neue.cc/2014/08/23_476.htmlhttps://github.com/neuecc/UniRxhttp://u3d.as/content/7tT 
Reactive Game Architecture
Binding, ReactiveStateMachine, etchttps://www.assetstore.unity3d.com/jp/#!/content/14381 
メジャーライブラリとなる ことでより安心して使える よう前進
Conclusion
C#使うならLINQ使わなきゃmottainai 
ところで性能は?
LINQ in Unity

LINQ in Unity