2

たとえば、linqsの列挙可能な範囲の上限を取得しようとしています:

Enumerable.Range(0, 3).Select(x => "index: " + x + " Max: ").ToList();

リストには次のものが必要です。

index: 0 Max: 3
index: 1 Max: 3
index: 2 Max: 3
...
4

3 に答える 3

7

できません。正確ではありません。ラムダ関数は常にインスタンスのスコープで実行されます。

次のようなことができます。

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()代わりに が必要ですか、それともいいえですか?

于 2013-05-28T20:54:57.453 に答える
2

できません。の入力はSelect任意のシーケンスである可能性があり、上限がまったくない場合もあります (もちろん、値は を超えることはできませんがInt32.MaxValue、それ以外は知る方法がありません)。

あなたの場合、 への引数Enumerable.Rangeがハードコーディングされているため、明らかに最大値を推測できますstart + count - 1 = 2。3 は最大値ではなくカウントであることに注意してください。それはたまたま排他的な上限ですが、それは開始値が 0 であるためだけです。

于 2013-05-28T20:54:53.030 に答える
0
var range = Enumerable.Range(0, 3);
var max = range.Max();
var s = range.Select(x => string.Format("Index: {0}, Max: {1}", x, max));
于 2013-05-28T20:55:50.760 に答える