小ネタ:Index付きSelectが限界超えたらどー成るか?
どーいうことだってばよ?
public static IEnumerable<TResult> Select<TSource, TResult>(this IEnumerable<TSource> source,Func<TSource, int, TResult> selector)
のsource
の要素数が、Int32.MaxValue
超えたらどーなるのか気になったので試してみた。
試してみたこと
以下のようなモノをこさえて、後はひたすら回すべしw
using System;
using System.Collections.Generic;
using System.Linq;
namespace ConsoleApplication2
{
class Program
{
static IEnumerable<long> CreateSequence()
{
for (long i = 0; i <= 2147483648; i++) yield return i;
}
static void Main(string[] args)
{
try
{
foreach (var elem in CreateSequence().Select((l, i) => new KeyValuePair<int, long>(i, l)))
{
if (elem.Value%1000000 == 0)
{
Console.WriteLine((elem.Value/2147483648.0*100).ToString("F2") + "%");
}
}
}
catch (OverflowException)
{
Console.WriteLine("Overflow detected!");
}
Console.WriteLine("Press enter to exit.");
Console.ReadLine();
}
}
}
こいつを、/checked-
でコンパイルしてOverFlowException
が飛んでくるかどうか試してみた。
結果とまとめ
飛んできた。
当該部分のコードリーディングしたところ、インデックスとして、selector
デリゲートに渡される変数のインクリメント部分が、明示的にchecked
ブロックで括られていたのでまぁそりゃそうなるよね。
Int32.MaxValue
超えるなんてそうそう無いとは思うけど、これも後学の為ということで一つ。
Author And Source
この問題について(小ネタ:Index付きSelectが限界超えたらどー成るか?), 我々は、より多くの情報をここで見つけました https://qiita.com/Tokeiya/items/a565b15241e31db2a77b著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .