Movatterモバイル変換


[0]ホーム

URL:


Yoshifumi Kawai, profile picture
Uploaded byYoshifumi Kawai
PDF, PPTX40,319 views

An Internal of LINQ to Objects

LINQ Study #3

Embed presentation

Download as PDF, PPTX
An Internal of LINQ to Objects2013/12/14Yoshifumi Kawai - @neuecc
Self Introduction@仕事株式会社グラニ 取締役CTOC# 5.0 + .NET Framework 4.5 + ASP.NET MVC 5最先端C#によるハイパフォーマンスWebアプリケーション@個人活動Microsoft MVP for Visual C#Web http://neue.cc/Twitter @neueccLINQがひじょーに好き、趣味はライブラリ作成
As LibrarianNuGet公開パッケージ数30突破https://www.nuget.org/profiles/neuecc/linq.jsJavaScriptにLINQ to Objectsを移植したライブラリhttp://linqjs.codeplex.com/その他色々Chaining Assertion(ユニットテスト補助), DynamicJson(dynamicなJSON),AsyncOAuth(PCLのOAuthライブラリ), CloudStructures(Object/Redisマッパー),ReactiveProperty(Rx + MVVM), AnonymousComparer(LINQ補助), etc...最近はOwinにムチューなのでMiddleware作ってきます
Session TargetLINQ to Objectsを十分知っている人知らない状態だと全体的にイミフかも?LINQ to Objectsという観点ではLEVEL 500を予定は未定もっと極めて見たいと思う人向け必ずどれかは知らなかった!というネタがあるはずもちろん、それ知ってるよ!もあるはず使えないネタから使えないネタまで基本的には使えないネタ多め、但し一部は非常に役立つかとは
Execution Pipeline
new Enumerable<T>()// メソッドチェーンEnumerable.Range(1, 10).Select(i => i * i).Take(5);// を、細分化すると?var rangeEnumerable = Enumerable.Range(1, 10);var selectEnumerable = rangeEnumerable.Select(i => i * i);var takeEnumerable = selectEnumerable.Take(5);takeEnumerable.GetEnumerator();
sourceの内包TakeSelectRange
下流から上流、上流から下流へ最下層からのMoveNextの要求が最上流まで連鎖し最上流からCurrentの値が最下層まで降りてくる
Immediate vs Deferred即時実行(Immediate Execution)クエリ演算子を呼ぶとすぐに実行されるものToArray, First, Sum, etc...ようするにIEnumerable<T>ではなく具体的な何かを返すもの遅延実行(Deferred Execution)クエリ演算子を呼んだ時点では実行されないものWhere, Select, OrderBy, etc...ようするにIEnumerable<T>を返すものメソッドチェーンしても毎回具体的な何かを返さないから実行効率やメモリ効率が良い、よって好きに繋げてください
Streaming vs Non-Streaming遅延実行は、更に2つのカテゴリーに分けられるStreaming必要なだけ少しずつ読み取っていくWhere, Select, Concat, Union, Distinct, Take, etc...Non-Streaming実行が開始された瞬間に全てのデータを読み込むOrderBy/Descending, ThenBy/Descending, GroupBy, ReverseJoin, GroupJoin, Except, Intersectは2つ目のシーケンス側が
Non-Streaming?OrderBy/Reverse/GroupByソートするためには全部読み込まなきゃソートできない!逆から列挙するには、まず全部読み込まなきゃ!グループ分けしたのを列挙するには、全部読み込まなきゃ!一部集合演算系Except/Intersectは、要素がもう片方の集合に含まれているか調べるには、先に片方を全部読んでHashSet生成が必要Join/GroupJoinも似たような感じ
MaterializationLINQの実行は遅延する何度でも実行される可能性があるもしそのシーケンスがUltra Heavyな処理を含んでいたら?複数回読みたい場合は、ToArrayで実体化(Materialization)することで二度読みすることを防ぐたまにIEnumerable<T>のままElementAtのラッシュしたりする人がいますがマジヤヴァイのでやめて
IEnumerator<T> is IDisposableIEnumerable<T>がリソースを抱えている可能性外部リソース(ファイル,DB, etc…)からの読み込みに便利二度読みすると重かったり結果が変化したりしやすくて危険static IEnumerable<string> EnumerateLines(string path){using (var sr = new StreamReader(path)){よって生のIEnumerator<T>を扱うとwhile (!sr.EndOfStream){きは必ずusingすること!foreachやyield return sr.ReadLine();LINQの標準クエリ演算子は全てusing}されています。これはmustです}}
Iterator Revisited
IEnumerable<T>LINQの中心となるインターフェイスLINQはIEnumerable<T>の連鎖を、生成することが出来る言語機能from C# 2.0yield returnとyield breakLINQ to Objectsはこれで実装されてる自分で作るときも勿論これを使う
イテレータはいつ開始されるかstatic IEnumerable<int> Iter(){Console.WriteLine("IterStart");yield return 1;Console.WriteLine("IterEnd");}static void Main(string[] args){Console.WriteLine("Before GetEnumerator");var e = Iter().GetEnumerator();Console.WriteLine("After GetEnumerator");Console.WriteLine("Before MoveNext1");e.MoveNext();Console.WriteLine("After MoveNext1");Console.WriteLine("Current:" + e.Current);Console.WriteLine("Before MoveNext2");e.MoveNext();Console.WriteLine("After MoveNext2");}
イテレータはいつ開始されるかstatic IEnumerable<int> Iter(){Console.WriteLine("IterStart");yield return 1;Console.WriteLine("IterEnd");}Before GetEnumeratorstatic void Main(string[] args){Console.WriteLine("Before GetEnumerator");var e = Iter().GetEnumerator();Console.WriteLine("After GetEnumerator");Console.WriteLine("Before MoveNext1");e.MoveNext();Console.WriteLine("After MoveNext1");Console.WriteLine("Current:" + e.Current);Console.WriteLine("Before MoveNext2");e.MoveNext();Console.WriteLine("After MoveNext2");}After MoveNext1Current:1Before MoveNext2After GetEnumeratorBefore MoveNext1IterStartIterEndAfter MoveNext2最初のMoveNextが呼ばれたタイミングで動き出す
State MachineEnumeratorは内部的に4つの状態を持つ初期値はbeforeMoveNextが呼ばれるとrunningになるyield returnに到達するとsuspendedになる実行中はrunningとsuspendedが繰り返されるrunning中のMoveNextの挙動は未定義、つまりスレッドセーフではないGetEnumeratorで得られる各Enumerator自体はスレッドセーフ、得られるEnumeratorがスレッドセーフではない、ということコード末尾、もしくはyield breakに到達するとafterになるまたは例外がthrowされた場合も
引数チェックのタイミングstatic IEnumerable<string> StringRepeat(string str, int count){// 引数チェックしてるのにif (str == null) throw new ArgumentNullException();for (int i = 0; i < count; i++){yield return str;}最初のMoveNextが呼ばれるまで本体は動き出さない}static void Main(string[] args){// 何も起こりませんvar repeat = StringRepeat(null, 100).Take(10);}MoveNextが呼ばれる = foreach or 即時実行のLINQクエリ演算子を呼んだ時
分離するというマナーpublic static IEnumerable<string> StringRepeat(string str, int count){// 引数チェックは先に行ってif (str == null) throw new ArgumentNullException();return StringRepeatCore(str, count);メソッドを2つに分割する}// 本体はprivateに分離private static IEnumerable<string> StringRepeatCore(string str, int count){for (int i = 0; i < count; i++){yield return str;}全てのLINQ標準クエリ演算子がこれに}従っています。自分でyield return使って実装する時も従うべき
DeepDive OrderBy
Stable Sort and Unstable Sort大雑把なソートの分類破壊的か、非破壊的かOrderByはIEnumerable<T>が元で破壊不能というのもあり非破壊的安定ソートか、非安定ソートか安定ソートは同じ値が来た時、ソート前の順序が維持されるOrderByのアルゴリズムはQuickSortQuickSortは非安定ソートOrderByは安定ソートん?あれ?
Schewarizian TransformMap.Sort.Mapシュワルツ変換、Perlでよく知られたイディオム比較関数が重たい時に、一度かけるだけで済むので計算量を軽減できるOrderByはだいたいそれと似たような感じ全要素をなめて元要素の配列を生成→比較関数を適用した要素の配列を生成ナンノコッチャ→0~lengthが要素のint配列(index)を生成→要素配列を元に比較してindex配列をソートArray.Sort(keys, items)みたいなもの→ソート済みindexを列挙して元要素の配列と照らしあわせて列挙
with ThenByThenByも同様に先に全部比較関数を適用するたとえ、要素が被らなくてThenBy使われなくてもね!OrderByやThenByは便利だしカジュアルに使っちゃうけれど、内部的には全LINQメソッドの中でも屈指のヘヴィさを誇ることを少しだけ気にとめよう
OrderBy as Shuffle, OrderBy as MaxByShuffleが欲しい?seq.OrderBy(_ => Guid.NewGuid())Sortの比較関数にランダムは危険で偏りが出てしまうだけどOrderByの仕組みの場合は比較関数ではないので大丈夫MaxBy, MinByが欲しい?seq.OrderBy(x => x.Age).First();seq.OrderByDescending(x => x.Age).First();さすがOrderBy、なんでもできる!そこにシビれる憧れれぅ!
No More 横着Max取るのにソートとかどうかしてるよ本来O(n)で済むのに!シャッフルだってもっと効率よくなる……よ?定番どころではFisher-Yatesアルゴリズムとかお手軽にやるならOK、本格的に使っていくなら自作書き捨てコードとかでは楽だし全然構わし平然とやるけど弊社の社内ライブラリにはShuffleやMaxByなど定義してある
Grouping Grouping Grouping
GroupBy vs ToLookupそもそもToLookup知らない?辞書のバリュー側がIEnumerableになってるものようは一つのキーに複数のバリューを格納できる超便利!ほんと!超使う!で、どっちもグルーピングGroupByは遅延実行(非ストリーミング)ToLookupは即時実行GroupByはToLookupしたあと即列挙するだけなので実は中身一緒
列挙の順序の保証例えばDictionaryは不定GroupByの場合は保証されているキーがシーケンスに最初に現れた順バリュー側の順序も出現順これはToLookupでも同様ToLookupとGroupByの中身は一緒だからただしこちらはドキュメントに記載無しなので保証と捉えられるかはグレーかもね
複数キーによるグルーピング匿名型を使おう!seq.GroupBy(x => new { x.Age, x.Name });匿名型はGetHashCodeとEqualsを全プロパティで比較して一致させるので、判定要素に使える裏にあるDictionaryを考える集合系やグルーピングなど、IEqualityComparerを受けるオーバーロードがあるものは裏でHashSetやDictionaryが暗躍している要素の等しさを判定するのにIEqualityComparerを使うわけです
IEqualityComparerダルい例えばDistinctで、重複除去を特定要素でだけしたい// こんな大げさなものを定義してpublic class AgeEqualityComparer : IEqualityComparer<Person>{public bool Equals(Person x, Person y){return x.Age.Equals(y.Age);}public int GetHashCode(Person obj){return obj.Age.GetHashCode();}}// こうする。ダルい。Ageで比較したいだけなのにseq.Distinct(new AgeEqualityComparer());.Distinct(x => x.Age)って書きたい
AnonymousComparerというものを公開していますhttp://linqcomparer.codeplex.com/PM> Install-Package AnonymousComparer何が出来る?AnonymousComparer.Create.Distinct(x => x.Age)って書ける!ラムダ式でIEqualityComparerを作成可能LINQ標準クエリ演算子へのオーバーロードIEqualityComparerを受けるオーバーロードが全てラムダ式受け入れ可に
Query Expression
クエリ構文 vs メソッド構文メソッド構文のほうが好きむしろクエリ構文嫌いメソッド構文のいいところLINQ to Objectsの全てのメソッドが使えるLINQ to Objectsの全てのオーバーロードが使えるSelectのindex付きオーバーロードとかクエリ構文使えないIntelliSensable!IntelliSenseがあるからクエリ構文よりむしろ書きやすい
Transparent Identifier #fromfrom a in sourcefrom b in sourcefrom c in sourcefrom d in sourcefrom e in sourcewhere a % 2 == 0 && b % 2 == 0 && c % 2 == 0select string.Concat(a, b, c, d, e);
Transparent Identifier #letfrom x in sourcelet a = x + xlet b = x - xlet c = x / xlet d = x * xselect a + b + c + d;
Language INtegreated Monadstatic void Main(string[] args){// クエリ構文でusingを表現var firstLines =from path in new[] { "foo.txt", "bar.txt" }from stream in File.OpenRead(path) // FileStreamがSelectManyの対象にfrom reader in new StreamReader(stream) // StreamReaderがSelectManyの対象にselect path + "¥t" + reader.ReadLine();}public static IEnumerable<TResult> SelectMany<TSource, TDisposable, TResult>(this IEnumerable<TSource> source,Func<TSource, TDisposable> disposableSelector,Func<TSource, TDisposable, TResult> resultSelector) where TDisposable : IDisposable{foreach (var item in source){using (var disposableItem = disposableSelector(item))Select, Where, SelectManyなどは{名前が一致すれば、自作メソッドyield return resultSelector(item, disposableItem);}をクエリ構文で使うことが可能}}
いろいろ変換されてすごーいけど、メソッド構文使うよね機構としては素晴らしい、けど全然使わないJOINが書きやすいと言えなくもないけれど、IntelliSenseの効きやすさを勘案すると、単発JOIN程度ならメソッド構文でも余裕もちろん多重fromやletは便利ではあるけれど、必要になる頻度は……クエリ構文では使えないメソッドが多すぎるクエリプロバイダのための制限自由に書けるメソッド構文ではクエリプロバイダによる解釈を逸脱しがちなので、制限を加えるためのものとしてはいい、主にSQLでそれでも結局、全て表現できなかったりで使えない
Internal Optimization
それAnyif(seq.Count() != 0) vs if(seq.Any())Countは最初から最後まで全て列挙して個数を計算するAnyは最初の一件があるかないかだけをチェックするAnyったらさいきょーねま、こういうチェックってその後に別のメソッドを、呼んでたら2回列挙ですね?→前の方のMaterializeの話ToArrayしますか、しましょうか
Count() vs CountCount()は全件列挙するからよくない?ICollection<T>を実装していれば、そちらのCountを使う(source as ICollection<T>).CountElementAt, Last, LastOrDefaultIList<T>を実装していればインデクサ経由でO(1)Lastは[xs.Length – 1]って書くのダルいので、普通に嬉しいReverseICollection<T>を実装していれば?CopyToを使って配列に一気にコピーしてから逆順forで列挙するIList<T>ではない、Indexer経由の遅さが気になるかもだからかな
There, There, Where, Where連打 is 楽しい.Where(x => pred1(x)).Where(x => pred2(x)).Where(x => pred3(x))それ&&?.Where(x => pred1(x) && pred2(x) && pred3(x))パイプライン削減?効率厨め!
LINQ has ComposabilityLINQの合成可能性を活かすときvar flag = true;var seq = Enumerable.Range(1, 10).Where(x => x % 2 == 0);if (flag){seq = seq.Where(x => x % 3 == 0).Take(2);}&&に常にまとめられるとは限らないFuncも合成できるけどC#で関数合成は面倒だしまたは、.Where(predicate)が意味でまとまってる時Where連打したほうがわかりやすいじゃない?
CombinePredicatesCombinePredicatesの名の通り、Where連打によるpredicateが&&で連結されているWhere3つのはずだけどすぐ真上にRangeIterator
連結の最適化結合してくれるので連打でもOKWhere.SelectとSelect.Selectも連結最適化されるWhere.SelectとSelect.Selectは同じイテレータに入る(WhereSelectEnumerableIterator)Select連打はまとまってCombineSelectorsに。また、Whereもpredicateとして保持
連結の破壊Select.Whereは壊れるIndex使う系のオーバーロードも使うと壊れる最下層にWhereEnumerable中間にWhereSelectEnumerable最上位層にRange
Empty Considered Harmfulto Aggregation
空シーケンスと集計例外出ます。Aggregateはseedつければ回避可能var empty = Enumerable.Empty<int>();// InvalidOperationExceptionvar product1 = empty.Aggregate((x, y) => x * y);// 0var product2 = empty.Aggregate(0, (x, y) => x * y);// InvalidOperationExceptionvar max = empty.Max();// InvalidOperationExceptionvar min = empty.Min();// InvalidOperationExceptionvar avg = empty.Average();Sumは0// 0var sum = empty.Sum();
空シーケンスとNullable(or class)例外出ません。// int?の空シーケンスvar empty = Enumerable.Empty<int?>();null返します。// InvalidOperationExceptionvar product = empty.Aggregate((x, y) => x * y);さすがにAggregateはダメこの振る舞いが妥当なのかは諸説あるとかないとか極力、値を返すようにする、という観点で見ればstructはデフォルト値がないからダメでclassならあるので返せるから、と見たり// nullvar max = empty.Max();// nullvar min = empty.Min();// nullvar avg = empty.Average();
DefaultIfEmpty #割と忘れる// Minが欲しいけどWhereでフィルタした結果Emptyになってしまう// けど例外は避けたい!// わざわざToArrayしてAnyで確認してから、とかも嫌!var min = Enumerable.Range(1, 10).Where(x => x > 10).Cast<int?>() // Nullableにキャストして.Min() ?? -1; // nullのままが嫌なら??で値を// 素直にDefaultIfEmpty使いましょう:)var min = Enumerable.Range(1, 10).Where(x => x > 10).DefaultIfEmpty(-1).Min();
記号演算のジェネリクス制約ないけど?気合!根性!そっ閉じ
Asynchronous LINQ非同期時代のLINQ http://neue.cc/2013/12/04_435.htmlを、読んでください(
linq.js
LINQ to Objects for JavaScriptJavaScript上で完全完璧に再現ICollectionなどの最適化 => 入ってるWhere.Whereなどの最適化 => 入ってるOrderByなどの仕組み => 入ってる標準クエリ演算子を全収録+αプラスアルファでむしろ二倍以上のメソッド数JavaScriptのための文字列ラムダ式, TypeScript定義, IntelliSense用vsdoc
ver.3 Beta5,6,7,8,9,,,2年近くベータ中!ゴメンナサイ未リリース状態(gitリポジトリ上のみ)の更新EqualityComparerの追加これで今まで再現度98%ぐらいだったのが100%にTupleの追加AnonymousTypeの代用として、これでGroupByが超捗るその他細かい調整多数次のベータリリースは1月か2月ぐらいで……!
Conclusion
まとめ凄くシンプル、でも凄く奥が深いちょっと実装するだけだととても単純なのだけど潜れば潜るほど色々なことが発見できるLINQ to EverythingLINQ to XML, Reactive ExtensionsAsynchronousに対する活用などなど沢山!LINQ to SQL, Entitiesは割とドウデモイイ

Recommended

PDF
【Unite Tokyo 2019】Understanding C# Struct All Things
PDF
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
PDF
Observable Everywhere - Rxの原則とUniRxにみるデータソースの見つけ方
PPTX
イベント駆動プログラミングとI/O多重化
PPTX
冬のLock free祭り safe
PDF
Pythonによる黒魔術入門
PDF
Unityでオンラインゲーム作った話
PDF
ネットワーク ゲームにおけるTCPとUDPの使い分け
PDF
【Unity道場スペシャル 2017札幌】最適化をする前に覚えておきたい技術 -札幌編-
PDF
きつねさんでもわかるLlvm読書会 第2回
PDF
【Unity】 Behavior TreeでAIを作る
PDF
こわくない Git
PDF
C++ マルチスレッド 入門
PDF
Unity C#と.NET Core(MagicOnion) C# そしてKotlinによるハーモニー
PDF
組み込みLinuxでのGolangのススメ
PDF
コールバックと戦う話
PPTX
CEDEC2021 ダウンロード時間を大幅減!~大量のアセットをさばく高速な実装と運用事例の共有~
PPTX
C#とILとネイティブと
PDF
C#の強み、或いは何故PHPから乗り換えるのか
PDF
20分くらいでわかった気分になれるC++20コルーチン
 
KEY
やはりお前らのMVCは間違っている
PDF
Observableで非同期処理
PPTX
【CEDEC2018】一歩先のUnityでのパフォーマンス/メモリ計測、デバッグ術
PDF
Riderはいいぞ!
PPTX
OpenVRやOpenXRの基本的なことを調べてみた
PDF
UniTask入門
PDF
Unity開発で使える設計の話+Zenjectの紹介
PDF
Unityでパフォーマンスの良いUIを作る為のTips
PDF
プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~
PDF
Union find(素集合データ構造)

More Related Content

PDF
【Unite Tokyo 2019】Understanding C# Struct All Things
PDF
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
PDF
Observable Everywhere - Rxの原則とUniRxにみるデータソースの見つけ方
PPTX
イベント駆動プログラミングとI/O多重化
PPTX
冬のLock free祭り safe
PDF
Pythonによる黒魔術入門
PDF
Unityでオンラインゲーム作った話
PDF
ネットワーク ゲームにおけるTCPとUDPの使い分け
【Unite Tokyo 2019】Understanding C# Struct All Things
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
Observable Everywhere - Rxの原則とUniRxにみるデータソースの見つけ方
イベント駆動プログラミングとI/O多重化
冬のLock free祭り safe
Pythonによる黒魔術入門
Unityでオンラインゲーム作った話
ネットワーク ゲームにおけるTCPとUDPの使い分け

What's hot

PDF
【Unity道場スペシャル 2017札幌】最適化をする前に覚えておきたい技術 -札幌編-
PDF
きつねさんでもわかるLlvm読書会 第2回
PDF
【Unity】 Behavior TreeでAIを作る
PDF
こわくない Git
PDF
C++ マルチスレッド 入門
PDF
Unity C#と.NET Core(MagicOnion) C# そしてKotlinによるハーモニー
PDF
組み込みLinuxでのGolangのススメ
PDF
コールバックと戦う話
PPTX
CEDEC2021 ダウンロード時間を大幅減!~大量のアセットをさばく高速な実装と運用事例の共有~
PPTX
C#とILとネイティブと
PDF
C#の強み、或いは何故PHPから乗り換えるのか
PDF
20分くらいでわかった気分になれるC++20コルーチン
 
KEY
やはりお前らのMVCは間違っている
PDF
Observableで非同期処理
PPTX
【CEDEC2018】一歩先のUnityでのパフォーマンス/メモリ計測、デバッグ術
PDF
Riderはいいぞ!
PPTX
OpenVRやOpenXRの基本的なことを調べてみた
PDF
UniTask入門
PDF
Unity開発で使える設計の話+Zenjectの紹介
PDF
Unityでパフォーマンスの良いUIを作る為のTips
【Unity道場スペシャル 2017札幌】最適化をする前に覚えておきたい技術 -札幌編-
きつねさんでもわかるLlvm読書会 第2回
【Unity】 Behavior TreeでAIを作る
こわくない Git
C++ マルチスレッド 入門
Unity C#と.NET Core(MagicOnion) C# そしてKotlinによるハーモニー
組み込みLinuxでのGolangのススメ
コールバックと戦う話
CEDEC2021 ダウンロード時間を大幅減!~大量のアセットをさばく高速な実装と運用事例の共有~
C#とILとネイティブと
C#の強み、或いは何故PHPから乗り換えるのか
20分くらいでわかった気分になれるC++20コルーチン
 
やはりお前らのMVCは間違っている
Observableで非同期処理
【CEDEC2018】一歩先のUnityでのパフォーマンス/メモリ計測、デバッグ術
Riderはいいぞ!
OpenVRやOpenXRの基本的なことを調べてみた
UniTask入門
Unity開発で使える設計の話+Zenjectの紹介
Unityでパフォーマンスの良いUIを作る為のTips

Viewers also liked

PDF
プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~
PDF
Union find(素集合データ構造)
PDF
深さ優先探索による塗りつぶし
PPTX
Friendlyを使ったwindowsアプリテスト自動化
PPTX
Unityで Photonを使ってリアルタイム・マルチプレイヤーゲームを作っちゃおう【応用編】
PDF
【Unite 2017 Tokyo】パフォーマンス向上のためのスクリプトのベストプラクティス
PPTX
もう一つのLINQ ~ Queryable入門
 
PPTX
LINQ 概要 + 結構便利な LINQ to XML
プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~
Union find(素集合データ構造)
深さ優先探索による塗りつぶし
Friendlyを使ったwindowsアプリテスト自動化
Unityで Photonを使ってリアルタイム・マルチプレイヤーゲームを作っちゃおう【応用編】
【Unite 2017 Tokyo】パフォーマンス向上のためのスクリプトのベストプラクティス
もう一つのLINQ ~ Queryable入門
 
LINQ 概要 + 結構便利な LINQ to XML

Similar to An Internal of LINQ to Objects

PPTX
C# 式木 (Expression Tree) ~ LINQをより深く理解するために ~
PPTX
Linqの速度測ってみた
PPTX
C#を始めたばかりの人へのLINQ to Objects
PDF
Final LINQ Extensions
PDF
UnityでのLINQ活用例
PPTX
Boost17 cpplinq
PDF
LINQ in Unity
PDF
VS勉強会 .NET Framework 入門
PDF
LINQソースでGO!
PPTX
C# LINQ ~深く知って、使いまくろう~
PPTX
Visual Studio による開発環境・プログラミングの進化
PDF
linq.js - Linq to Objects for JavaScript
PDF
MlnagoyaRx
PPTX
LINQ概要
PPTX
LINQ の概要とかもろもろ
PDF
MlnagoyaRx02
PDF
非.NETerに向けたLINQの紹介
PDF
Linq To Fun
 
PDF
The History of LINQ
PPTX
Linqことはじめ
C# 式木 (Expression Tree) ~ LINQをより深く理解するために ~
Linqの速度測ってみた
C#を始めたばかりの人へのLINQ to Objects
Final LINQ Extensions
UnityでのLINQ活用例
Boost17 cpplinq
LINQ in Unity
VS勉強会 .NET Framework 入門
LINQソースでGO!
C# LINQ ~深く知って、使いまくろう~
Visual Studio による開発環境・プログラミングの進化
linq.js - Linq to Objects for JavaScript
MlnagoyaRx
LINQ概要
LINQ の概要とかもろもろ
MlnagoyaRx02
非.NETerに向けたLINQの紹介
Linq To Fun
 
The History of LINQ
Linqことはじめ

More from Yoshifumi Kawai

PDF
The Usage and Patterns of MagicOnion
PDF
Deep Dive async/await in Unity with UniTask(UniRx.Async)
PDF
Deep Dive async/await in Unity with UniTask(EN)
PDF
NextGen Server/Client Architecture - gRPC + Unity + C#
PDF
A quick tour of the Cysharp OSS
PDF
ZeroFormatterに見るC#で最速のシリアライザを作成する100億の方法
PDF
Building the Game Server both API and Realtime via c#
PDF
ライブラリ作成のすゝめ - 事例から見る個人OSS開発の効能
PDF
A Brief History of UniRx/UniTask, IUniTaskSource in Depth
PDF
「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践
PDF
Unityによるリアルタイム通信とMagicOnionによるC#大統一理論の実現
PDF
Memory Management of C# with Unity Native Collections
PDF
Binary Reading in C#
PDF
How to make the Fastest C# Serializer, In the case of ZeroFormatter
PDF
ZeroFormatter/MagicOnion - Fastest C# Serializer/gRPC based C# RPC
PDF
True Cloud Native Batch Workflow for .NET with MicroBatchFramework
PDF
Implements OpenTelemetry Collector in DotNet
PDF
What, Why, How Create OSS Libraries - 過去に制作した30のライブラリから見るC#コーディングテクニックと個人OSSの...
PPTX
RuntimeUnitTestToolkit for Unity
PPTX
RuntimeUnitTestToolkit for Unity(English)
The Usage and Patterns of MagicOnion
Deep Dive async/await in Unity with UniTask(UniRx.Async)
Deep Dive async/await in Unity with UniTask(EN)
NextGen Server/Client Architecture - gRPC + Unity + C#
A quick tour of the Cysharp OSS
ZeroFormatterに見るC#で最速のシリアライザを作成する100億の方法
Building the Game Server both API and Realtime via c#
ライブラリ作成のすゝめ - 事例から見る個人OSS開発の効能
A Brief History of UniRx/UniTask, IUniTaskSource in Depth
「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践
Unityによるリアルタイム通信とMagicOnionによるC#大統一理論の実現
Memory Management of C# with Unity Native Collections
Binary Reading in C#
How to make the Fastest C# Serializer, In the case of ZeroFormatter
ZeroFormatter/MagicOnion - Fastest C# Serializer/gRPC based C# RPC
True Cloud Native Batch Workflow for .NET with MicroBatchFramework
Implements OpenTelemetry Collector in DotNet
What, Why, How Create OSS Libraries - 過去に制作した30のライブラリから見るC#コーディングテクニックと個人OSSの...
RuntimeUnitTestToolkit for Unity
RuntimeUnitTestToolkit for Unity(English)

An Internal of LINQ to Objects


[8]ページ先頭

©2009-2025 Movatter.jp