gpt4 book ai didi

c# - 具有开始和间隔的理想 C# IEnumerable 通用数字序列

转载 作者:行者123 更新时间:2023-12-02 05:04:14 26 4
gpt4 key购买 nike

我一直在寻找,但找不到,一个实现 IEnumerable 的通用类的惯用示例,它是这样做的:构造函数采用 startinterval,以及 GetEnumerator 返回 IEnumerator,它从 starts 开始,一直持续返回具有间隔的项目。

换句话说,像这样:

public class Sequence<T> : IEnumerable<T> where T :... {

public T start { get; private set; }
public T interval { get; private set; }

Sequence(T start, T interval)
{
...
}

IEnumerator<T> GetEnumerator()
{
for(T n = start ; ; n += interval) // does not compile
yield return n;
}

... what else?
}

有很多相关的问题和小片段、点点滴滴,但我还没有找到一个完整类的好例子,它至少做了足够相似的事情。这是关于如何实现它的,所以如果有现有的类可以做到这一点,那么最好知道,但不是问题的答案。

那么,实际问题是:引入对此有用的新功能的最新 C# 版本是什么?使用它执行此操作的理想示例代码是什么?

此外,如果没有经验的 C# 开发人员会犯与此类类相关的任何常见陷阱和错误,那将是很好的了解。


更新:由于我所要求的确切内容似乎是不可能的,我想下一个最好的办法是用 lambda 替换 interval 以获得下一个项目,或类似的东西。

最佳答案

感谢 dlev 推荐 Func,我最初只是使用一个辅助类。

public class Sequence<T> : IEnumerable<T>
{
public T Start { get; private set; }
public T Interval { get; private set; }
private Func<T, T, T> Adder { get; set; }

public Sequence(T start, T interval, Func<T,T,T> adder)
{
Start = start;
Interval = interval;
Adder = adder;
}

public IEnumerator<T> GetEnumerator()
{
for (T n = Start; ; n = Adder.Invoke(n, Interval))
yield return n;
}

IEnumerator IEnumerable.GetEnumerator()
{
return this.GetEnumerator();
}
}

然后你可以像这样使用它:

int i = 0;
foreach (int t in new Sequence<int>(3, 4, (int a, int b) => a + b))
{
if (i == 10)
{
break;
}
i++;
Console.WriteLine(t);
}

或者,您可以要求 T 实现某种 Addable 接口(interface)并调用该 Add 方法,但我认为这样更简洁周围。

关于c# - 具有开始和间隔的理想 C# IEnumerable 通用数字序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16527668/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com