<?xml version="1.0" encoding="UTF-8"?> 
<feed version="0.3" xmlns="http://purl.org/atom/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xml:lang="ja">
<title>Gushwell's C# Dev Notes</title> 
<link rel="alternate" type="text/html" href="http://gushwell.ldblog.jp/" />
<link rel="service.post" type="application/x.atom+xml" href="http://cms.blog.livedoor.com/atom/blog_id=164237" title="Gushwell's C# Dev Notes" />
<link rel="hub" href="http://pubsubhubbub.appspot.com" />
<link rel="self" href="http://gushwell.ldblog.jp/atom.xml" />
<modified>2012-05-17T22:52:53Z</modified> 
<tagline><![CDATA[C#, .NETの話題を中心に。時々F＃も。 Web サイト<a href="http://gushwell.ifdef.jp/" target="_blank">「Gushwell's C# Programing Page」</a>も宜しく！]]></tagline> 
<id>tag:blog.livedoor.jp,:gushwell</id>
<author>
<name>gushwell</name> 
</author>
<generator url="http://blog.livedoor.com/" version="1.0">livedoor Blog</generator> 
<copyright>Copyright (c) 2012, gushwell </copyright>
<entry>
<title>Interactive Extensions(Ix) - StartWithメソッド</title> 
<link rel="alternate" type="text/html" href="http://gushwell.ldblog.jp/archives/52246361.html" />
<modified>2012-05-13T13:33:03Z</modified> 
<issued>2012-05-13T22:30:25+09:00</issued> 
<id>tag:blog.livedoor.jp,2012:gushwell.52246361</id>
<summary type="text/plain">EnumerableEx.StartWith拡張メソッドは、シーケンスの先頭に値を付加してくれます。
これ、前からあれば良いなーと思ってた機能です。

使い方はこんな感じ。



            var nums = new[] { 1, 2, 3 };
            nums.StartWith(0).ForEach(Console.WriteLine);


0 ...</summary> 
<dc:subject>InteractiveExtensions</dc:subject>
<content type="text/html" mode="escaped" xml:lang="ja" xml:base="http://gushwell.ldblog.jp/archives/52246361.html">
<![CDATA[EnumerableEx.StartWith拡張メソッドは、シーケンスの先頭に値を付加してくれます。
これ、前からあれば良いなーと思ってた機能です。<br>
<br>
使い方はこんな感じ。<br>
<br>

<textarea class="brush:c#;">
            var nums = new[] { 1, 2, 3 };
            nums.StartWith(0).ForEach(Console.WriteLine);
</textarea>
<br>
0 と nums が連結されて、新たなシーケンスとなります。<br>
<br>
なお、可変引数となっているので、<br>
<br>
<textarea class="brush:c#;">
            var nums = new[] { 1, 2, 3 };
            nums.StartWith(-2, -1, 0).ForEach(Console.WriteLine);
</textarea>
<br>
という書き方もできます。<br>
<br>
この場合の結果は、<br>
<br>
<textarea class="brush:plain;">
-2
-1
0
1
2
3
</textarea>
<br>
と表示されます。<br>
]]> 
</content>
<author>
<name>gushwell</name> 
</author>
</entry>

<entry>
<title>Interactive Extensions(Ix) - SkipLastメソッド</title> 
<link rel="alternate" type="text/html" href="http://gushwell.ldblog.jp/archives/52246356.html" />
<modified>2012-05-06T12:33:04Z</modified> 
<issued>2012-05-06T21:30:10+09:00</issued> 
<id>tag:blog.livedoor.jp,2012:gushwell.52246356</id>
<summary type="text/plain">EnumerableEx.SkipLast拡張メソッドは、後ろからn個の要素をスキップします。

シーケンスの要素数がいくつかわからないけど、最後の n 個は無視したい、という場合に使うことに
なると思います。


            var nums = Enumerable.Range(1, 13);
            nums.SkipL...</summary> 
<dc:subject>InteractiveExtensions</dc:subject>
<content type="text/html" mode="escaped" xml:lang="ja" xml:base="http://gushwell.ldblog.jp/archives/52246356.html">
<![CDATA[EnumerableEx.SkipLast拡張メソッドは、後ろからn個の要素をスキップします。<br>
<br>
シーケンスの要素数がいくつかわからないけど、最後の n 個は無視したい、という場合に使うことに
なると思います。<br>
<br>
<textarea class="brush:c#;">
            var nums = Enumerable.Range(1, 13);
            nums.SkipLast(3).ForEach(Console.WriteLine);
</textarea>

<br>

結果は、<br>
<br>
<textarea class="brush:plain;">
1
2
3
4
5
6
7
8
9
10
</textarea>
<br>
と表示されます。<br>
<br>]]> 
</content>
<author>
<name>gushwell</name> 
</author>
</entry>

<entry>
<title>Interactive Extensions(Ix) - Shareメソッド</title> 
<link rel="alternate" type="text/html" href="http://gushwell.ldblog.jp/archives/52246353.html" />
<modified>2012-05-03T13:03:03Z</modified> 
<issued>2012-05-03T22:00:21+09:00</issued> 
<id>tag:blog.livedoor.jp,2012:gushwell.52246353</id>
<summary type="text/plain">EnumerableEx.Share拡張メソッドは、
名前からすれば、列挙を共有するメソッドということになるわけですが、
なんて説明したら良いのか言葉でうまく言い表せません。

Shareメソッドで作成されたシーケンスは、ある場所にバッファリングされ、
列挙する際は、そのバッファー...</summary> 
<dc:subject>InteractiveExtensions</dc:subject>
<content type="text/html" mode="escaped" xml:lang="ja" xml:base="http://gushwell.ldblog.jp/archives/52246353.html">
<![CDATA[EnumerableEx.Share拡張メソッドは、<br>
名前からすれば、列挙を共有するメソッドということになるわけですが、<br>
なんて説明したら良いのか言葉でうまく言い表せません。<br>
<br>
Shareメソッドで作成されたシーケンスは、ある場所にバッファリングされ、<br>
列挙する際は、そのバッファーが作成されると言ったら良いのでしょうか？<br>
<br>
まずは、そのコードと動きを見た方が分かりやすいです。<br>
<br>

<textarea class="brush:c#;">
 var seq = Enumerable.Range(1, 10).Share();
 int n1 = seq.First();
 int n2 = seq.First();
 int n3 = seq.First();
 Console.WriteLine(n1);
 Console.WriteLine(n2);
 Console.WriteLine(n3);
</textarea>
<br>

結果は、<br><br>
<textarea class="brush:plain;">
1
2
3
</textarea>
<br>
です。<br>
<br>
<textarea class="brush:plain;">
1
1
1
</textarea>
<br>

ではありません。<br>
<br>
これを利用すれば、こんなコードが書けます。<br>
<br>
<textarea class="brush:c#;">
 var seq = Enumerable.Range(1, 10).Share();
 string s = seq.First().ToString();
 foreach (var n in seq) {
     s += "," + n;
 }
 Console.WriteLine("&lt;{0}&gt;",s);
</textarea>
<br>

結果は、<br>
<br>
<textarea class="brush:plain;">
&lt;1,2,3,4,5,6,7,8,9,10&gt;
</textarea>
<br>
と出力されます。<br>
これをShareを使わないで書くとすると、どうなるかを考えてみると、このメソッドの偉大さが
分かります。<br>
このコードの場合は、String.Joinを使えばいいんじゃねっ、という突っ込みは無しでお願いします。<br>
<br>
ちなみに、Share()メソッドが返す方は、IBuffer&lt;TSource&gt; となっています。<br>
<br>
もう一つのオーバーロードメソッドがありますが、そちらは試してません。<br>
<br>]]> 
</content>
<author>
<name>gushwell</name> 
</author>
</entry>

<entry>
<title>Interactive Extensions(Ix) - Scanメソッド</title> 
<link rel="alternate" type="text/html" href="http://gushwell.ldblog.jp/archives/52246352.html" />
<modified>2012-04-29T13:03:04Z</modified> 
<issued>2012-04-29T22:00:55+09:00</issued> 
<id>tag:blog.livedoor.jp,2012:gushwell.52246352</id>
<summary type="text/plain">EnumerableEx.Scan拡張メソッドは、LINQ標準のAggregateと同じことをやりますが、
その途中結果を列挙してくれます。返ってくるシーケンスの最後の要素が、
Aggregateと同じ値になります。

まずは、Aggregateの例です。
1から10までを足した結果を求めています。


 var tot...</summary> 
<dc:subject>InteractiveExtensions</dc:subject>
<content type="text/html" mode="escaped" xml:lang="ja" xml:base="http://gushwell.ldblog.jp/archives/52246352.html">
<![CDATA[EnumerableEx.Scan拡張メソッドは、LINQ標準のAggregateと同じことをやりますが、<br>
その途中結果を列挙してくれます。返ってくるシーケンスの最後の要素が、<br>
Aggregateと同じ値になります。<br>
<br>
まずは、Aggregateの例です。<br>
1から10までを足した結果を求めています。<br>
<br>
<textarea class="brush:c#;">
 var total = Enumerable.Range(1,10).Aggregate((result,item) =&gt; result + item);
 Console.WriteLine(total);
</textarea>
<br>

もちろん、結果は、<br>
<br>
<textarea class="brush:plain;">
55
</textarea>
<br>

と出力されます。<br>
<br>
次に、Scanを使ったコードです。<br>
<br>
<textarea class="brush:c#;">
 var seq = Enumerable.Range(1, 10).Scan((result, item) =&gt; result + item);
 seq.ForEach(Console.WriteLine);
 Console.WriteLine("total=&gt;{0}",seq.Last());
</textarea>
<br>

実行結果を示します。<br>
<br>
<textarea class="brush:plain;">
3
6
10
15
21
28
36
45
55
total=&gt;55
</textarea>
<br>

Aggregateって何？という方も、これならば、計算の途中結果が分かるので、理解できる
と思います。<br>
<br>
もう一つ例を示します。<br>
さっきの例とほとんど同じだけど、Scanの別バージョンを使った例です。<br>
<br>

<textarea class="brush:c#;">
 var seq = Enumerable.Range('A',10).Scan("", (result, item) =&gt; result + (char)item);
 seq.ForEach(s =&gt; Console.WriteLine(s));
</textarea>
<br>

結果は、以下の通り。<br>
<br>
<textarea class="brush:plain;">
A
AB
ABC
ABCD
ABCDE
ABCDEF
ABCDEFG
ABCDEFGH
ABCDEFGHI
ABCDEFGHIJ
</textarea>
<br>


]]> 
</content>
<author>
<name>gushwell</name> 
</author>
</entry>

<entry>
<title>Interactive Extensions(Ix) - Returnメソッド</title> 
<link rel="alternate" type="text/html" href="http://gushwell.ldblog.jp/archives/52246348.html" />
<modified>2012-04-25T14:33:03Z</modified> 
<issued>2012-04-25T23:30:57+09:00</issued> 
<id>tag:blog.livedoor.jp,2012:gushwell.52246348</id>
<summary type="text/plain"> EnumerableEx.Return static メソッドは、単一の要素のシーケンスを返します。

 以下、ためしに書いたコードです。


 var seq = EnumerableEx.Return(DateTime.Today);
 seq.ForEach(d =&amp;gt; Console.WriteLine(&quot;{0}&quot;,d));
 Console.WriteLine(seq.Count());



実行すると、...</summary> 
<dc:subject>InteractiveExtensions</dc:subject>
<content type="text/html" mode="escaped" xml:lang="ja" xml:base="http://gushwell.ldblog.jp/archives/52246348.html">
<![CDATA[ EnumerableEx.Return static メソッドは、単一の要素のシーケンスを返します。<br>
<br>
 以下、ためしに書いたコードです。<br>
<br>
<textarea class="brush:c#;">
 var seq = EnumerableEx.Return(DateTime.Today);
 seq.ForEach(d =&gt; Console.WriteLine("{0}",d));
 Console.WriteLine(seq.Count());
</textarea>
<br>

実行すると、以下のような結果が得られます。<br>
<br>

<textarea class="brush:plain;">
2012/03/09 0:00:00
1
</textarea>
<br>

どんな時に利用するのかが、想像力の無い僕にはすぐには思いつきません。<br>
<br>
<textarea class="brush:c#;">
new [] { DateTimr.Today };
</textarea>
<br>

と書く代わりに、<br>
<br>
<textarea class="brush:c#;">
EnumerableEx.Return(DateTime.Today);
</textarea>
<br>

と書きたいということなのかな？<br>
確かに、インテリセンスは聞くけど、new [] {} とタイプするのは
それほど苦じゃないしなー。<br>
<br>
そうじゃなくて、評価を遅らせたいという時に利用するということなのかな？<br>
それなら何となくわかる気がするけど、具合的な例が思い浮かばない。<br>
たぶん、そういった場面に遭遇すれば、「ああ、こういうときに使えるのか！」<br>
とひらめくと思うのですが...<br>
<br>
]]> 
</content>
<author>
<name>gushwell</name> 
</author>
</entry>

<entry>
<title>Interactive Extensions(Ix) - Memoizeメソッド</title> 
<link rel="alternate" type="text/html" href="http://gushwell.ldblog.jp/archives/52236792.html" />
<modified>2012-04-23T13:58:21Z</modified> 
<issued>2012-04-22T23:00:46+09:00</issued> 
<id>tag:blog.livedoor.jp,2012:gushwell.52236792</id>
<summary type="text/plain">EnumerableEx.Memoize拡張メソッドは、シーケンスをメモ化してくれます。
このメソッドの戻り値を使い、複数回呼び出した場合は、キャッシュされた
値を返します。
同じシーケンスを複数回列挙する場合に、速度向上に威力を発揮します。

まずは、値がキャッシュされているか...</summary> 
<dc:subject>InteractiveExtensions</dc:subject>
<content type="text/html" mode="escaped" xml:lang="ja" xml:base="http://gushwell.ldblog.jp/archives/52236792.html">
<![CDATA[EnumerableEx.Memoize拡張メソッドは、シーケンスをメモ化してくれます。<br>
このメソッドの戻り値を使い、複数回呼び出した場合は、キャッシュされた<br>
値を返します。<br>
同じシーケンスを複数回列挙する場合に、速度向上に威力を発揮します。<br>
<br>
まずは、値がキャッシュされているかどうかが確かめられるように、<br>
以下のような、シーケンスを生成するメソッドを定義します。<br>
<br>
<textarea class="brush:c#;">
 private static IEnumerable&lt;int&gt; CreateSequence() {
     for (int i = 0; i &lt; 5; i++) {
         Console.WriteLine(i);
         yield return i;
     }
 }
</textarea>
<br>

最初に、Memoizeを使わないコードだとどうなるかを見てみます。<br>
<br>
<textarea class="brush:c#;">
 var seq = CreateSequence();
 Console.WriteLine("Start");
 int n1 = seq.Sum();
 Console.WriteLine("Sum={0}",n1);
 double n2 = seq.Average();
 Console.WriteLine("Avg={0}",n2);
</textarea>
<br>

これを実行した結果を以下に示します。<br>
<br>
<textarea class="brush:plain;">
Start
0
1
2
3
4
Sum=10
0
1
2
3
4
Avg=2
</textarea>
<br>


複数回、列挙されているのが分かります。<br>
では、次に、Memoizeを使った例です。<br>
<br>
<textarea class="brush:c#;">
 var seq = CreateSequence().Memoize();
 Console.WriteLine("Start");
 int n = seq.Sum();
 Console.WriteLine(n);

 int n2 = seq.Average();
 Console.WriteLine(n2);
</textarea>
<br>

以下、実行結果です。<br>
<br>
<textarea class="brush:plain;">
Start
0
1
2
3
4
Sum=10
Avg=2
</textarea>
<br>



注目してほしいのは、<br>
<br>
<textarea class="brush:plain;">
0
1
2
3
4
Start
Sum=10
Avg=2
</textarea>
<br>


ではないということです。つまり、Memoize()を呼びだしても<br>
列挙はされません。遅延実行の原則がここでも生きています。<br>
<br>]]> 
</content>
<author>
<name>gushwell</name> 
</author>
</entry>

<entry>
<title>Interactive Extensions(Ix) - Retryメソッド</title> 
<link rel="alternate" type="text/html" href="http://gushwell.ldblog.jp/archives/52236798.html" />
<modified>2012-04-18T14:33:04Z</modified> 
<issued>2012-04-18T23:30:48+09:00</issued> 
<id>tag:blog.livedoor.jp,2012:gushwell.52236798</id>
<summary type="text/plain">EnumerableEx.Retry拡張メソッドは、列挙中に例外が発生すると、再度列挙を試みてくれます。

こんなコードを書いてみました。


 static void Main(string[] args) {
     CreateNums().Retry().ForEach(Console.WriteLine);
     Console.ReadLine();
 }

 private static ...</summary> 
<dc:subject>InteractiveExtensions</dc:subject>
<content type="text/html" mode="escaped" xml:lang="ja" xml:base="http://gushwell.ldblog.jp/archives/52236798.html">
<![CDATA[EnumerableEx.Retry拡張メソッドは、列挙中に例外が発生すると、再度列挙を試みてくれます。<br>
<br>
こんなコードを書いてみました。<br>
<br>
<textarea class="brush:c#;">
 static void Main(string[] args) {
     CreateNums().Retry().ForEach(Console.WriteLine);
     Console.ReadLine();
 }

 private static Random _rnd = new Random();

 static private IEnumerable&lt;int&gt; CreateNums() {
     for (int n = 0; n &lt; 5; n++) {
         if (_rnd.Next(8) == 0) {
             Console.WriteLine("Error");
             throw new System.Exception();
         }
         yield return n;
     }
 }
</textarea>
<br>


この実行例を示します。<br>
<br>
<textarea class="brush:plain;">
0
1
2
Error
0
1
2
3
4
</textarea>
<br>

途中で、例外が発生したので、再度列挙しているのが分かります。<br>
なお、再列挙中にまた例外が発生すると、再度列挙してくれます。<br>
<br>
Retry()メソッドには、retryCountを引数に取るオーバーロードが用意されています。<br>
<br>
<textarea class="brush:c#;">
 CreateNums().Retry(2).ForEach(Console.WriteLine);
</textarea>
<br>
 のように書けば、2回まで再列挙を試みます。<br>
<br>]]> 
</content>
<author>
<name>gushwell</name> 
</author>
</entry>

<entry>
<title>Interactive Extensions(Ix) - Repeatメソッド</title> 
<link rel="alternate" type="text/html" href="http://gushwell.ldblog.jp/archives/52236796.html" />
<modified>2012-04-15T13:03:05Z</modified> 
<issued>2012-04-15T22:00:50+09:00</issued> 
<id>tag:blog.livedoor.jp,2012:gushwell.52236796</id>
<summary type="text/plain">EnumerableEx.Repeatメソッドは、拡張メソッドと、staticメソッドの2種類のメソッドがあります。
Repeatメソッドは、その名の通り、値を繰り返し列挙することができます。

まずは、拡張メソッドの例です。


  var seq = new string[] { &quot;A&quot;, &quot;B&quot;, &quot;C&quot;};
  seq.Repeat().Tak...</summary> 
<dc:subject>InteractiveExtensions</dc:subject>
<content type="text/html" mode="escaped" xml:lang="ja" xml:base="http://gushwell.ldblog.jp/archives/52236796.html">
<![CDATA[EnumerableEx.Repeatメソッドは、拡張メソッドと、staticメソッドの2種類のメソッドがあります。<br>
Repeatメソッドは、その名の通り、値を繰り返し列挙することができます。<br>
<br>
まずは、拡張メソッドの例です。<br>
<br>
<textarea class="brush:c#;">
  var seq = new string[] { "A", "B", "C"};
  seq.Repeat().Take(28).ForEach(s =&gt; Console.Write("{0} ",s));
</textarea>
<br>

無限に繰り返すので、Takeメソッドで最初の 28 個だけを取り出しています。<br>
これが無いと、プログラムが終わりません。<br>
この結果は、<br>
<br>
<textarea class="brush:plain;">
A B C A B C A B C A B C A B C A B C A B C A B C A B C A
</textarea>
<br>

と表示されます。<br>
<br>
繰り返し回数を指定することもできます。<br>
<br>
<textarea class="brush:c#;">
 var seq = new string[] { "A", "B", "C"};
 seq.Repeat(3).ForEach(s =&gt; Console.Write("{0} ",s));
</textarea>
<br>

とすれば、３回繰り返します。<br>
シーケンスの要素を３つだけを取り出すのではなく、入力となるシーケンスを3回繰り返して<br>
値を生成するということです。<br>
つまり結果は以下の通りです。<br>
<br>
<textarea class="brush:plain;">
A B C A B C A B C
</textarea>
<br>
<br>
では、次に、staticメソッドの例です。<br>
<br>

<textarea class="brush:c#;">
 var seq = new string[] { "X", "Y" };
 EnumerableEx.Repeat(seq, 4)
             .ForEach(strs =&gt; Console.Write("{0}{1} ", strs[0],strs[1]));
</textarea>
<br>

結果は、<br>
<br>
<textarea class="brush:plain;">
XY XY XY XY
</textarea>
<br>

です。拡張メソッドのほうとは微妙に違っています。<br>
こちらば、第一引数で渡したオブジェクトの方が、列挙する型となります。<br>
この例では、stringではなく、string[] が繰り返されることになります。<br>
<br>]]> 
</content>
<author>
<name>gushwell</name> 
</author>
</entry>

<entry>
<title>Interactive Extensions(Ix) - OnErrorResumeNextメソッド</title> 
<link rel="alternate" type="text/html" href="http://gushwell.ldblog.jp/archives/52236793.html" />
<modified>2012-04-11T13:33:06Z</modified> 
<issued>2012-04-11T22:30:46+09:00</issued> 
<id>tag:blog.livedoor.jp,2012:gushwell.52236793</id>
<summary type="text/plain">EnumerableEx.OnErrorResumeNext拡張メソッドは、値を列挙中に例外が発生しても、
例外が発生しなくても引数で指定したシーケンスを後続し、列挙するメソッドです。

例えば、次のようなメソッドがあったとします。


 static private IEnumerable CreateNums() {
     ...</summary> 
<dc:subject>InteractiveExtensions</dc:subject>
<content type="text/html" mode="escaped" xml:lang="ja" xml:base="http://gushwell.ldblog.jp/archives/52236793.html">
<![CDATA[EnumerableEx.OnErrorResumeNext拡張メソッドは、値を列挙中に例外が発生しても、<br>
例外が発生しなくても引数で指定したシーケンスを後続し、列挙するメソッドです。<br>
<br>
例えば、次のようなメソッドがあったとします。<br>
<br>
<textarea class="brush:c#;">
 static private IEnumerable&lt;int&gt; CreateNums() {
     Random rnd = new Random();
     for (int n = 0; n &lt; 5; n++) {
         if (rnd.Next(5) == 0) {
             Console.WriteLine("Error");
             throw new System.Exception();
         }
         yield return n;
     }
 }
</textarea>
<br>

このメソッドは、ある確率で、列挙中に例外が発生します。<br>
<br>
このメソッドに続けて、OnErrorResumeNext メソッドを呼び出すコードを示します。<br>
<br>
<textarea class="brush:c#;">
   var seq = CreateNums().OnErrorResumeNext(new[] { 100, 200, 300 });
   seq.ForEach(Console.WriteLine);
</textarea>
<br>

これを実行すると、<br>
<br>
<textarea class="brush:plain;">
0
1
Error
100
200
300
</textarea>
<br>

とか<br>
<br>
<textarea class="brush:plain;">
0
1
2
3
4
100
200
300
</textarea>
<br>

などと表示されます。前者は例外が発生した例、後者は例外が発生しない例です。<br>
<br>
]]> 
</content>
<author>
<name>gushwell</name> 
</author>
</entry>

<entry>
<title>Interactive Extensions(Ix) - MaxByメソッド、MinByメソッド</title> 
<link rel="alternate" type="text/html" href="http://gushwell.ldblog.jp/archives/52236790.html" />
<modified>2012-04-08T13:03:04Z</modified> 
<issued>2012-04-08T22:00:52+09:00</issued> 
<id>tag:blog.livedoor.jp,2012:gushwell.52236790</id>
<summary type="text/plain">EnumerableEx.MaxBy拡張メソッドは、指定されたキーの値で最大値だったもの（複数）を返します。
Max拡張メソッドは、一つの値を返しますが、MaxByは、該当するすべての値を列挙します。

以下のようなコードを書いてみました。


 var nums = new DateTime[] { 
     new Da...</summary> 
<dc:subject>InteractiveExtensions</dc:subject>
<content type="text/html" mode="escaped" xml:lang="ja" xml:base="http://gushwell.ldblog.jp/archives/52236790.html">
<![CDATA[EnumerableEx.MaxBy拡張メソッドは、指定されたキーの値で最大値だったもの（複数）を返します。<br>
Max拡張メソッドは、一つの値を返しますが、MaxByは、該当するすべての値を列挙します。<br>
<br>
以下のようなコードを書いてみました。<br>
<br>
<textarea class="brush:c#;">
 var nums = new DateTime[] { 
     new DateTime(2010,2,4),
     new DateTime(2010,5,14),
     new DateTime(2011,6,24),
     new DateTime(2012,11,1),
     new DateTime(2013,5,18),
     new DateTime(2014,5,24),
 };
 nums.MaxBy(d =&gt; d.Day)
     .ForEach(d =&gt; Console.WriteLine(d.ToString("yyyy/MM/dd")));
</textarea>
<br>

実行結果は、以下の通りです。<br>
<br>
<textarea class="brush:plain;">
2011/06/24
2014/05/24
</textarea>
<br>
EnumerableEx.MinBy拡張メソッドもあります。<br>
使い方は、同じなので、コードは省略します。<br>
<br>]]> 
</content>
<author>
<name>gushwell</name> 
</author>
</entry>
</feed>

