NyaRuRuさんが俺の書いたコードをLINQやらを駆使して書きかえてくれた。
http://d.hatena.ne.jp/NyaRuRu/20080120/p2
その中で、使い方とかをあまり理解してなかったメソッドがいくつかあったので実験。
知らなかったメソッドは下の3つ。
とりあえずRepeatから。
これは第一引数に指定したものを、第二引数で指定した回数だけ返すIEnumerableを返すっぽい。
早速実験。
[Test]
[ExpectedException(ExceptionType=typeof(ArgumentOutOfRangeException))]
public void Repeat()
{
var repeat = Enumerable.Repeat(10, 3);
Assert.AreEqual(10, repeat.ElementAt(0));
Assert.AreEqual(10, repeat.ElementAt(1));
Assert.AreEqual(10, repeat.ElementAt(2));
repeat.ElementAt(3); // exception!!
}
NyaRuRuさんのBlogでは、1つだけしかないものをLINQに渡すためのエントリポイントを作るためのような感じで使われてた。
次は、TakeWhile!
これは、IEnumerableから第一引数で渡されたFuncがfalseを返すまでの要素を返す。
[Test]
public void TakeWhile()
{
var range = Enumerable.Range(1, 10);
var takeWhile = range.TakeWhile((i) => i <= 5); // 1~5
Assert.AreEqual(1, takeWhile.ElementAt(0));
Assert.AreEqual(2, takeWhile.ElementAt(1));
Assert.AreEqual(3, takeWhile.ElementAt(2));
Assert.AreEqual(4, takeWhile.ElementAt(3));
Assert.AreEqual(5, takeWhile.ElementAt(4));
}
最後にConcat。これはくっつけるだけです。
[Test]
public void Concat()
{
var a = Enumerable.Range(1, 3); // 1,2,3
var b = Enumerable.Range(4, 3); // 4,5,6
var c = Enumerable.Concat(a, b);
Assert.AreEqual(6, c.Count());
Assert.AreEqual(1, c.ElementAt(0));
Assert.AreEqual(2, c.ElementAt(1));
Assert.AreEqual(3, c.ElementAt(2));
Assert.AreEqual(4, c.ElementAt(3));
Assert.AreEqual(5, c.ElementAt(4));
Assert.AreEqual(6, c.ElementAt(5));
}