たとえば、linqsの列挙可能な範囲の上限を取得しようとしています:
Enumerable.Range(0, 3).Select(x => "index: " + x + " Max: ").ToList();
リストには次のものが必要です。
index: 0 Max: 3
index: 1 Max: 3
index: 2 Max: 3
...
できません。正確ではありません。ラムダ関数は常にインスタンスのスコープで実行されます。
次のようなことができます。
var range = Enumerable.Range(0, 3);
range.Select(x => "index: " + x + " Max: " + range.Max()).ToList();
しかし、次のようにすることもできます。
var range = Enumerable.Range(0, 3);
var max = range.Max();
range.Select(x => "index: " + x + " Max: " + max).ToList();
ところで、使用した範囲はゼロ ( [ 0, 1, 2 ]
) から始まるため、最大値は 3 ではなく 2 になります。.Count()
代わりに が必要ですか、それともいいえですか?
できません。の入力はSelect
任意のシーケンスである可能性があり、上限がまったくない場合もあります (もちろん、値は を超えることはできませんがInt32.MaxValue
、それ以外は知る方法がありません)。
あなたの場合、 への引数Enumerable.Range
がハードコーディングされているため、明らかに最大値を推測できますstart + count - 1 = 2
。3 は最大値ではなくカウントであることに注意してください。それはたまたま排他的な上限ですが、それは開始値が 0 であるためだけです。
var range = Enumerable.Range(0, 3);
var max = range.Max();
var s = range.Select(x => string.Format("Index: {0}, Max: {1}", x, max));