gpt4 book ai didi

c# - 将递归替换为 TimerCallback 以迭代所有变体

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:28:32 25 4
gpt4 key购买 nike

我正在尝试寻找一种算法来间隔打印数组中值的所有变化。看起来理解起来很简单,但是我找不到如何为此管理数据...

例如,我有以下对象的列表(列表中的参数数量可以变化):

List<Arg> lst = new List<Arg>();
lst.Add(new Arg { Name = "a", InitValue = 1, MaxValue = 2, Step = 1 });
lst.Add(new Arg { Name = "b", InitValue = 2, MaxValue = 6, Step = 2 });
lst.Add(new Arg { Name = "c", InitValue = 4, MaxValue = 12, Step = 4 });

现在我需要遍历所有 args 变体(每次迭代都有所有参数)并打印它们。挑战在于如何在迭代之间使用间隔而不是使用 Thread.Sleep。我想使用 System.Threading.Timer 并打印 TimerCallback 方法中的每个变体。

示例输出:

a = 1, b = 2, c = 4
a = 1, b = 2, c = 8
a = 1, b = 2, c = 12

a = 1, b = 4, c = 4
a = 1, b = 4, c = 8
a = 1, b = 4, c = 12

a = 1, b = 6, c = 4
a = 1, b = 6, c = 8
a = 1, b = 6, c = 12

a = 2, b = 2, c = 4
a = 2, b = 2, c = 8
a = 2, b = 2, c = 12

a = 2, b = 4, c = 4
a = 2, b = 4, c = 8
a = 2, b = 4, c = 12

a = 2, b = 6, c = 4
a = 2, b = 6, c = 8
a = 2, b = 6, c = 12

我可以通过递归轻松完成,但它不适用于 TimerCallback...

谢谢

最佳答案

我相信您可以通过递归和 yield 轻松做到这一点.

yield ,您可以编写与通常方式非常相似的代码,并让您的函数返回 IEnumerator。相反,使用 yield return从枚举器返回下一个项目。然后,在每个计时器事件中,只需获取下一个元素。

这是我构建的一个小示例,说明您将如何使用 yield以类似的方式:

public class Test
{
static System.Collections.IEnumerator enumerator;
static void Main()
{
// Display powers of 2 up to the exponent of 8:
enumerator = Power(2, 8);
bool done = false;
while (!done)
done = !timerEvent();
}

static bool timerEvent()
{
if (!enumerator.MoveNext())
return false;
else
Console.Write("{0} ", enumerator.Current);
return true;
}

// This will be your function
static System.Collections.IEnumerator Power(int number, int exponent)
{
int result = 1;
for (int i = 0; i < exponent; i++)
{
result = result * number;
yield return result;
}
}
// Output: 2 4 8 16 32 64 128 256
}

Live demo .

既然你提到你可以通过递归轻松地做到这一点,我将把它应用到你的问题上取决于你。

使用yield使用递归,您可能必须 change your code a little .

关于c# - 将递归替换为 TimerCallback 以迭代所有变体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21174160/

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