C#,将case语句转换为yield语句

Fox*_*loy 1 c# yield yield-return

我想使用yield关键字将此语句转换为更优雅的东西,以构建用于测试的VM映像列表,但语法让我困惑。

期望的最终目标。

List<VmImages> images;
images[0] - WindowsServer2019
images[1] - WindowsServer2016
images[2] - RhelServer;
images[3] - OpenLogic;
Run Code Online (Sandbox Code Playgroud)

今天的代码如下所示:

for (var i = 0; i < LinuxVMs; i++)
{
    switch (i)
    {
        case 0:
            linuxDistros.Add(ConfigLoader.redHat);
            break;
        case 1:
            linuxDistros.Add(ConfigLoader.openLogic);
            break;
        case 2:
            linuxDistros.Add(ConfigLoader.suse);
            break;
        case 3:
            linuxDistros.Add(ConfigLoader.ubuntu);
            break;
    }
}
Run Code Online (Sandbox Code Playgroud)

这感觉是一个很好的例子,使用yield关键字将逻辑简化为这样的,我调用GetLinuxVMs()x次,其中X是的计数LinuxVMs

private static IEnumerable<VmDistribution> GetLinuxVmDistros()
{
    yield return ConfigLoader.redHat;
    yield return ConfigLoader.openLogic;
    yield return ConfigLoader.suse;
    yield return ConfigLoader.canonical;
}
Run Code Online (Sandbox Code Playgroud)

我不确定如何将其集成到我的代码中,这是我尝试过的:

for (var i = 0; i < LinuxVMs; i++)
{
    linuxDistros.Add(GetLinuxVmDistros());
}
Run Code Online (Sandbox Code Playgroud)

由于我每次都会从该方法中得到一个 IEnum GetLinuxVmDistros,所以我很困惑它到底是如何工作的。

Cai*_*ard 5

从您所说的“期望的最终目标”

List<VmImages> images = new() {
    WindowsServer2019,
    WindowsServer2016,
    RhelServer,
    OpenLogic
}
Run Code Online (Sandbox Code Playgroud)

恕我直言,所有其余的循环/欺骗只是让问题变得混乱