如果Start=0
和Count=10
那么如何使用Enumerable.Range()
获取备用值
输出应该像{ 0, 2, 4, 6, 8 }
如果Start=1
和Count=10
则{ 1, 3, 5, 7, 9 }
连续值可以像
一样var a = Enumerable.Range(0,10).ToList();
但是如何获得替代值?
答案 0 :(得分:45)
将Range应生成的项目数量(其第二个参数)减半,然后将结果值加倍,将得到正确的项目数,并确保增加2。
Enumerable.Range(0,5).Select(x => x * 2)
答案 1 :(得分:30)
Enumerable.Range(0, 10).Where(i => i % 2 == 0); // { 0, 2, 4, 6, 8 }
Enumerable.Range(0, 10).Where(i => i % 2 != 0); // { 1, 3, 5, 7, 9 }
答案 2 :(得分:7)
代码中的count
参数看起来像循环的end
点。
public static MyExt
{
public static IEnumerable<int> Range(int start, int end, Func<int, int> step)
{
//check parameters
while (start <= end)
{
yield return start;
start = step(start);
}
}
}
用法:MyExt.Range(1, 10, x => x + 2)
返回1到10之间的数字与步骤2
MyExt.Range(2, 1000, x => x * 2)
返回2到1000之间的数字,每次乘以2。
答案 3 :(得分:1)
据我所知,你在这里的内容并不存在于BCL中,所以你必须创建自己的静态类来实现所需的功能:
public static class MyEnumerable {
public static IEnumerable<int> AlternateRange(int start, int count) {
for (int i = start; i < start + count; i += 2) {
yield return i;
}
}
}
然后您可以在任何地方使用它:
foreach (int i in MyEnumerable.AlternateRange(0, 10)) {
//your logic here
}
然后,您还可以使用此方法执行LINQ查询,因为它返回IEnumerable
所以,如果你想要,如果你想排除数字6
,你也可以这样写上面的内容foreach (int i in MyEnumerable.AlternateRange(0, 10).Where( j => j != 6)) {
//your logic here
}
我希望这就是你所追求的目标。
您不能将此作为Enumerable
类的扩展方法直接使用,因为它是一个静态类,扩展方法适用于类的对象,而不是类本身。这就是为什么你要创建一个新的静态类来保存这个方法,如果你想模仿Enumerable
类。
答案 4 :(得分:0)
这可以使用Linq并指定最小值,长度和步长值来更简单地完成:
Enumerable.Range(min, length).Where(i => (i - min) % step == 0);
使用0到10,步长为2:
var result = Enumerable.Range(0, 10).Where(i => (i - 10) % 2 == 0);
输出:
0, 2, 4, 6, 8
使用1到10,步长为2:
var result = Enumerable.Range(1, 10).Where(i => (i - 10) % 2 == 0);
输出:
1, 3, 5, 7, 9
您可以进一步做一个简单的函数,以使用最小值,最大值和步长值将其输出:
public static IEnumerable<int> RangedEnumeration(int min, int max, int step)
{
return Enumerable.Range(min, max - min + 1).Where(i => (i - min) % step == 0);
}
将范围长度设置为max - min + 1
的原因是为了确保max
的值包含在内。如果max
应该是排他性的,请删除+ 1
。
用法:
var Result = RangedEnumeration(0, 10, 2); // 0, 2, 4, 6, 8, 10
var Result = RangedEnumeration(1, 10, 2); // 1, 3, 5, 7, 9
var Result = RangedEnumeration(1000, 1500, 150); // 1000, 1150, 1300, 1450