#contents


*違い [#r906c364]
||First|Take(1)|h
|~Emptyに接続|OnError()|OnCompleted()|

System.LinqのFirst()と同じで、InvalidOperationExceptionが投げられてOnError()が呼ばれる。
一方Take()は流れてくるデータが足りなくてもOnCompleted()が呼ばれる。
*テスト [#x32f9d99]
#code(CSharp,nooutline){{
private static void Main(string[] args)
{
    //何も流さず完了
    Observable.Empty<Unit>()
        .FirstAsync()
        .Subscribe(new TestObserver<Unit>("Empty.First"));
    Observable.Empty<Unit>()
        .Take(1)
        .Subscribe(new TestObserver<Unit>("Empty.Take"));

    //1つだけ流して完了
    Observable.Return(Unit.Default)
        .FirstAsync()
        .Subscribe(new TestObserver<Unit>("Return.First"));
    Observable.Return(Unit.Default)
        .Take(1)
        .Subscribe(new TestObserver<Unit>("Return.Take"));

    //10個流して完了
    Observable.Repeat(Unit.Default, 10)
        .FirstAsync()
        .Subscribe(new TestObserver<Unit>("Repeat.First"));
    Observable.Repeat(Unit.Default, 10)
        .Take(1)
        .Subscribe(new TestObserver<Unit>("Repeat.Take"));
}

//テスト用簡易Observer
private class TestObserver<T> : IObserver<T>
{
    public string Tag { get; }

    public TestObserver(string tag)
    {
        Tag = tag;
    }

    public void OnNext(T value)
    {
        Console.WriteLine($"{Tag}#OnNext:{value.ToString()}");
    }

    public void OnError(Exception error)
    {
        Console.WriteLine($"{Tag}#OnError");
    }

    public void OnCompleted()
    {
        Console.WriteLine($"{Tag}#OnCompleted");
    }
}
}}

出力
 Empty.First#OnError
 Empty.Take#OnCompleted
 Return.First#OnNext:()
 Return.First#OnCompleted
 Return.Take#OnNext:()
 Return.Take#OnCompleted
 Repeat.First#OnNext:()
 Repeat.First#OnCompleted
 Repeat.Take#OnNext:()
 Repeat.Take#OnCompleted