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@Nickmaovichx=>x
创建一个无限集合,但是您仍然可以使用对其进行操作。首先
.Take
.Skip
等。枚举无限集合而不使用任何中断
条件程序挂起,但是这是一个预期结果,就像while(true)
。