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

发布于 2024-10-01 16:26:09 字数 335 浏览 2 评论 0原文

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

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

可以得到连续值,

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

但是如何得到替代值呢?

If Start=0 and Count=10 then how to get the alternate values using Enumerable.Range()
the out put should be like { 0, 2, 4, 6, 8 }

and if Start=1 and Count=10 then { 1, 3, 5, 7, 9 }

The continuous value can be get like

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

but how to get the alternate values?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

雪花飘飘的天空 2024-10-08 16:26:09

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

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

Halving the number of items that Range should generate (its second parameter) and then doubling the resulting values will give both the correct number of items and ensure an increment of 2.

Enumerable.Range(0,5).Select(x => x * 2)
☆獨立☆ 2024-10-08 16:26:09
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 }
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 }
许一世地老天荒 2024-10-08 16:26:09

代码中的 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);
    }
  }
}

用法:MyExt.Range(1, 10, x => x + 2) 通过步骤 2 返回 1 到 10 之间的数字
MyExt.Range(2, 1000, x => x * 2) 返回 2 到 1000 之间的数字,每次乘以 2。

The count parameter in your code looks like an end point of the loop.

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);
    }
  }
}

Usage: MyExt.Range(1, 10, x => x + 2) returns numbers between 1 to 10 with step 2
MyExt.Range(2, 1000, x => x * 2) returns numbers between 2 to 1000 with multiply 2 each time.

七禾 2024-10-08 16:26:09

据我所知,您在这里所追求的内容并不存在于 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 类,您必须创建一个新的静态类来保存此方法。

What you are after here does not exist in the BCL as far as I'm aware of, so you have to create your own static class like this to achieve the required functionality:

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;
    }
  }
}

Then you can use it like this wherever you want to:

foreach (int i in MyEnumerable.AlternateRange(0, 10)) {
  //your logic here
}

You can then also perform LINQ queries using this since it returns IEnumerable

So if you want you can also write the above like this if you want to exclude the number 6

foreach (int i in MyEnumerable.AlternateRange(0, 10).Where( j => j != 6)) {
  //your logic here
}

I hope this is what you are after.

You can't have this as an extension method on the Enumerable class directly since that is a static class, and extension methods work on an object of a class, and not the class itself. That's why you have to create a new static class to hold this method if you want to mimic the Enumerable class.

心意如水 2024-10-08 16:26:09

使用 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

This can be done more simply using Linq and by specifying the minimum, length, and step values:

Enumerable.Range(min, length).Where(i => (i - min) % step == 0);

Usage with 0 through 10 at a step size of 2:

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

Output:

0, 2, 4, 6, 8

Usage with 1 through 10 at a step size of 2:

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

Output:

1, 3, 5, 7, 9

You could go further and make a simple function to output it using a minimum, maximum, and step value:

public static IEnumerable<int> RangedEnumeration(int min, int max, int step)
{
    return Enumerable.Range(min, max - min + 1).Where(i => (i - min) % step == 0);
}

The reason to set the range length to max - min + 1 is to ensure the max value is inclusive. If the max should be exclusive, remove the + 1.

Usage:

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
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文