UniRx: SubscribeWithState は Subscribe より効率がよい

以下のサンプルは、1 秒ごとにテキストを更新するサンプルです。 using System; using UniRx; using UnityEngine; using UnityEngine.UI; public class Main : MonoBehaviour { [SerializeField] private Text _text = null; void Start() { Observable.Inte…

UniRx: DistinctUntilChanged

Observable.DistinctUntilChanged は同じ値を連続して流さないオペレータです。 using UniRx; using UniRx.Diagnostics; using UnityEngine; public class Main : MonoBehaviour { void Start() { var s = new[] {1, 2, 3, 2, 2, 2, 5, 5} .ToObservable() .…

UniRx: Hot と Cold (2)

UniRx: Hot と Cold (1) - C#練習日記 の続きです。63 of 115 からです。 Cold な Observable は分岐できない Cold な Observable は Observer をひとつしか持てません。 using System; using UniRx; using UnityEngine; public class Main : MonoBehaviour …

UniRx: Hot と Cold (1)

Rx の Hot, Cold について、以下のスライドが参考になります。 今日こそ理解するHot / Cold @社内RxSwift勉強会 from Yuki Takahashi www.slideshare.net このスライドではプログラミング言語として Swift を採用していますが、Rx は特定のプログラミング言…

UniRx: Distinct

Observable.Distinct は、ストリームに重複値を流さないようにするオペレータです。 using UniRx; using UniRx.Diagnostics; using UnityEngine; public class Main : MonoBehaviour { void Start() { var s = new[] {1, 2, 3, 2, 2, 5, 5} .ToObservable() …

UniRx: コルーチンを IObservable 化する

Observable.FromCoroutineValue() でコルーチンを IObservable 化することができます。 コルーチンの yield return の値が OnNext に渡ります。 using System; using System.Collections; using UniRx; using UniRx.Diagnostics; using UnityEngine; public …

UniRx: ToObservable() が From() に代わりになるのかな

Rx には From というオペレータがあります。 UniRx には From が定義されてないようですが、ToObservable() というのがあります。 このメソッドを使うと、IEnumerable<T> を IObservable<T> に変換できます。 using UniRx; using UniRx.Diagnostics; using UnityEn</t></t>…

UniRx: Debug() 拡張メソッド

ObservableDebugExtensions.cs に Debug() 拡張メソッドが定義されています。 この拡張メソッドを使うと、OnNext や OnCompleted などのイベント時にログが出力されるようになります。 (これはデバッグ機能として提供されており、DEBUG シンボルが定義されて…

UniRx: Delay

Observable.Delay() は通知データを好きな期間だけ遅らせることができるオペレータです。 using System; using UniRx; using UnityEngine; public class Main : MonoBehaviour { void Start() { Debug.Log("Start"); var s = Observable.Range(10, 3).Delay(…

UniRx: Empty

Observable.Empty() は、Subscribe() するとすぐに完了を通知します。 using UniRx; using UnityEngine; public class Main : MonoBehaviour { void Start() { var s = Observable.Empty<Unit>(); s.Subscribe(e => Debug.Log("e: " + e), () => Debug.Log("OnComp</unit>…

.NET Core API リファレンスと .NET Core Source Browser のURLのメモ

.NET API ブラウザー | Microsoft Docs Source Browser 例えば System.Collections.Generic.List<T> を検索するには class List< まで入力すると検索候補にでてきます(List で検索するとマッチ候補が多くて探しにくくなります)。</t>

UniRx: Concat

Observable.Concat() は複数の IObservable<T> を順番に実行するオペレーターです。 using System; using UniRx; using UnityEngine; public class Main : MonoBehaviour { void Start() { // 1 秒ごとに通知 var a = Observable.Interval(TimeSpan.FromSeconds</t>…

UniRx: 購読をキャンセルする

IObservable<T>.Subscribe() から返却される IDisposable の Dispose() を呼び出すと購読がキャンセルされます。 using System; using UniRx; using UnityEngine; public class Main : MonoBehaviour { private IDisposable _disposable; void Start() { var s </t>…

UniRx: AddTo() 拡張メソッドのソースを読む

この記事では、AddTo() 拡張メソッドを用いると、ゲームオブジェクトの破棄タイミングで購読を破棄する仕組みを眺めていきます。 次のサンプルコードでは、Observable.Interval() で一定時間ごとにログを出力します。 また、スペースキーを押すとシーンが切…

UniRx: Observable.ReturnUnit のソースを読む

Observable.ReturnUnit のサンプルコード using System; using UniRx; using UnityEngine; public class Main : MonoBehaviour { void Start() { var s = Observable.ReturnUnit(); s.Subscribe(e => Debug.Log("e: " + e), () => Debug.Log("OnCompleted"))…

UniRx: Start

Observable.Start メソッドは、引数で指定した Func<T> 関数から生成したデータを通知します。 using System; using UniRx; using UnityEngine; public class Main : MonoBehaviour { private IObservable<DateTime> _observable; void Start() { _observable = Observabl</datetime></t>…

UniRx: Return

void Start() { var s = Observable.Return(100); s.Subscribe(e => Debug.Log(e), () => Debug.Log("OnCompleted")); } 実行結果です。 100 OnCompleted UniRx の Return の実装を読む。パフォーマンスを上げるために、通知する値の型に応じて実装をもって…

ToLookup 拡張メソッド

以前に Partition 関数 - C#練習日記 を作りましたが、 Linq には ToLookup 拡張メソッド があり、このメソッドを使うことで同様のグルーピングを行うことができます。 using System; using System.Linq; class Program { static void Main() { var xs = new…

プロパティへの代入がコンストラクタ内のみなら、そのプロパティに private set を定義する必要はない

using System; class Person { public string Name { get; } // 代入はコンストラクタでのみ。private set; は不要 public int Age { get; } public Person(string name, int age) { Name = name; Age = age; } } class Program { public static void Main()…

N 番目の要素を O(1) で取得する Cycle クラスを作る

数列 a = { 0, 1, 0, -1, 0, 1, 0, -1, 0, 1, 0, -1, ... } のような 4 周期で繰り返す数列で、かつ N 番目の要素を O(1) で取得する Cycle クラスを作ってみました。 // 0, 1, ... を繰り返す数列 var zeroOne = new Cycle<int>(new[] { 0, 1 }); Console.WriteL</int>…

エラトステネスの篩

haskell.g.hatena.ne.jp 上の記事をみて、エラトステネスの篩を C# で書いてみました。 // 2, 3, 4, 5, ... static IEnumerable<int> Nums() { int n = 2; while (true) yield return n++; } static Func<int, bool> MakePrimeFilter(int prime, Func<int, bool> isPrime) { // x はこれ</int,></int,></int>…

IEnumerable<T> のランダムな要素を選択する

d.hatena.ne.jp 上の記事で紹介されている「要素全体をメモリに保持せずに、ランダムな要素を選択する」アルゴリズムが面白いです。 C# で書いてみました。 public static class Extensions { // source が空だったり、配列やリストの場合の対応は後述 publi…

インターフェース型の変数への代入と 3 項演算子を組み合わせるとコンパイルエラーになる

クラス A と、クラス B が IDisposable を実装しているとします。 そのときに、3 項演算子を用いて、以下のように書くことはできないようです。 class A : IDisposable { ... } class B : IDisposable { ... } // コンパイルエラーになる: There is no impli…

構造体を定義すると Equals が自動的に実装されるが、IEquatable<T> を実装した方がよい

方法: 型の値の等価性を定義する (C# プログラミング ガイド) | Microsoft Docs より: 構造体を定義すると、System.Object.Equals(Object) メソッドの System.ValueType オーバーライドから継承された値の等価性が既定で実装されます。 この実装では、リフレ…

Mono 5.0 と C# 7 の Local Functions, Tuples で遊ぶ

Mono 5.0 と C# 7 で遊びます。 Mono 5.0.0 Release Notes | Mono まずは、mono のアップグレード。 $ brew upgrade mono mono のバージョンの確認。 $ mono --version Mono JIT compiler version 5.0.1.1 (2017-02/5077205 Wed May 31 14:47:54 BST 2017) C…

算術シフト、論理シフト

using System; class Program { static void Display(int n) { Console.WriteLine(" int {0,12} {1,32}", n, Convert.ToString(n, 2)); } static void Display(uint n) { Console.WriteLine("uint {0,12} {1,32}", n, Convert.ToString(n, 2)); } static voi…

関数から整数(int)を 2 つ返すとき、配列とタプルの速度差を調べる

int の配列を new するのと、タプルを生成するのとで速度に差が出るのか計測してみました。 using System; using System.Diagnostics; class Program { static int[] CreateArray(int a, int b) { return new[] { a, b }; } static Tuple<int, int> CreateTuple(int a,</int,>…

0 と 1 を交互に繰り返したいときは xor を使う

変数に格納されている整数値が、 0 のときは 1 を返す 1 のときは 0 を返す というように 0 と 1 を交互に繰り返したいときは、1 と xor するとできます。 $ csharp Mono C# Shell, type "help;" for help Enter statements below. csharp> int a = 0; cshar…

文字列リテラルにダブルクォートを含める

文字列リテラルにダブルクォートを含めるには、次のようにします。 標準の文字列リテラルなら、バックスラッシュでエスケープします 逐語的文字列リテラルなら、ダブルクォートを 2 つ重ねます using System; class Program { static void Main() { Console.…

IEnumerable, IEnumerator

GetEnumerator() を定義すると、foreach でループを回すことができます。 using System; using System.Collections; using System.Collections.Generic; class Program { static IEnumerable<int> G() { yield return 1; yield return 2; } static IEnumerator<int> T(</int></int>…