如何使用Enumerable.Range获取备用号码?

时间:2010-11-10 08:35:10

标签: c# .net linq enumerable.range

如果Start=0Count=10那么如何使用Enumerable.Range()获取备用值 输出应该像{ 0, 2, 4, 6, 8 }

如果Start=1Count=10{ 1, 3, 5, 7, 9 }

连续值可以像

一样
var a = Enumerable.Range(0,10).ToList();

但是如何获得替代值?

5 个答案:

答案 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