代码之家  ›  专栏  ›  技术社区  ›  Thorin Oakenshield

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

  •  11
  • Thorin Oakenshield  · 技术社区  · 14 年前

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

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

    连续值可以是

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

    但是如何得到替代值呢?

    4 回复  |  直到 8 年前
        1
  •  1
  •   Abhishek Siddhu Viper    7 年前

    据我所知,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 可枚举的 上课。

        2
  •  51
  •   Scott Munro Shimmy Weitzhandler    12 年前

    Enumerable.Range(0,5).Select(x => x * 2)
    
        3
  •  39
  •   abatishchev Karl Johan    14 年前
    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 }
    
        4
  •  8
  •   Cheng Chen    14 年前

    这个 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) MyExt.Range(2, 1000, x => x * 2) 返回2到1000之间的数字,每次乘以2。

        5
  •  0
  •   Martin Joseph Silber    5 年前

    这可以更简单地使用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);
    

    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 最大值 + 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