Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用Enumerable.Range获取备用数字?_C#_.net_Linq_Enumerable.range - Fatal编程技术网

C# 如何使用Enumerable.Range获取备用数字?

C# 如何使用Enumerable.Range获取备用数字?,c#,.net,linq,enumerable.range,C#,.net,Linq,Enumerable.range,如果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(); 但是如何获得替代值呢?将范围应生成的项目数减半(其第二个参数),然后将结果值加倍,将获得正确的项目数并确保增量为2 Enumerable.Range(0,5).Select(x => x * 2

如果
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();

但是如何获得替代值呢?

将范围应生成的项目数减半(其第二个参数),然后将结果值加倍,将获得正确的项目数并确保增量为2

Enumerable.Range(0,5).Select(x => x * 2)

据我所知,您在这里所追求的内容在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;
    }
  }
}
然后还可以使用它执行LINQ查询,因为它返回IEnumerable

如果你想,你也可以这样写,如果你想排除数字6

foreach (int i in MyEnumerable.AlternateRange(0, 10).Where( j => j != 6)) {
  //your logic here
}
我希望这就是你想要的


不能直接将其作为
可枚举
类的扩展方法,因为该类是静态类,扩展方法作用于类的对象,而不是类本身。这就是为什么如果要模拟
可枚举
类,就必须创建一个新的静态类来保存此方法。

代码中的
count
参数看起来像循环的
端点

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);
    }
  }
}
publicstaticmyext
{
公共静态IEnumerable范围(int start、int end、Func step)
{
//检查参数
while(开始x+2)
在步骤2中返回1到10之间的数字
MyExt.Range(2,1000,x=>x*2)
返回2到1000之间的数字,每次乘以2。

这可以更简单地使用Linq并通过指定最小值、长度和步长值来完成:

Enumerable.Range(min, length).Where(i => (i - min) % step == 0);
在步长为2时使用0到10:

var result = Enumerable.Range(0, 10).Where(i => (i - 10) % 2 == 0);
var result = Enumerable.Range(1, 10).Where(i => (i - 10) % 2 == 0);
输出:

0, 2, 4, 6, 8
1, 3, 5, 7, 9
在步长为2时使用1到10:

var result = Enumerable.Range(0, 10).Where(i => (i - 10) % 2 == 0);
var result = Enumerable.Range(1, 10).Where(i => (i - 10) % 2 == 0);
输出:

0, 2, 4, 6, 8
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);
}

@托马斯·安德森:使用'for'循环我们可以做到这一点。但是我们可以使用
LINQ
吗?@Thomas:人们开始讨厌
for
/
foreach
循环,当他们使用LINQ时。LINQ是一种时尚,而
for
是过时的。所以他们尝试使用LINQ甚至
for
都更合适。你的两个例子都有很多不同之处tart=0,Count=10-这就是你想要的吗?@Danny/Thomas:函数式编程没有错。代码行更少,副作用更少->bug更少。@Pramodh-btw,上面表达式的.Select(X=>X)部分是多余的,可以删除。var a=Enumerable.Range(0,10)。ToList();做了完全相同的事情。这是最好的答案。我想补充一点,您可以将其用于任何增量,它比创建一个自定义类省去了硬代码跳过其他元素的麻烦。例如,如果我正在编写代码来选择时间跨度中的分钟,而我只想显示15分钟增量:Enumerable.Range(0,60).Where(i=>i%15==0)我不知道我在想什么!我的否决票一直被锁定,直到答案被编辑,所以我添加了一个解释,以便可以推翻它。我的道歉!@user180326奇数:可枚举。范围(1,5)。选择(x=>x*2-1)这个解决方案不如下面的leppie或abatishchev。将挂起x=>x@Nickmaovich
x=>x
创建一个无限集合,但是您仍然可以使用
对其进行操作。首先
.Take
.Skip
等。枚举无限集合而不使用任何
中断
条件程序挂起,但是这是一个预期结果,就像
while(true)