C# 如何将switch case生成VM镜像列表的逻辑改用yield实现
你已经用yield写好了返回镜像序列的方法,只需要一行代码就能替换原来整个for+switch逻辑:
// 需引入命名空间 using System.Linq; linuxDistros.AddRange(GetLinuxVmDistros().Take(LinuxVMs));
实现说明
Take(n)方法会从GetLinuxVmDistros()返回的序列中按顺序取前n个元素(n就是你的配置值LinuxVMs),刚好匹配你原来按序号取对应镜像的需求AddRange()可以直接把IEnumerable类型的序列批量加到已有的linuxDistros集合中,不需要你自己循环遍历添加- 这种实现还天然处理了边界情况,如果
LinuxVMs的配置值大于你yield返回的总镜像数(当前是4个),会自动只返回所有可用的镜像,不会抛出异常,比原来的switch写法更安全
如果你不想依赖LINQ,也可以手动遍历取指定数量的元素:
using var enumerator = GetLinuxVmDistros().GetEnumerator(); for (var i = 0; i < LinuxVMs && enumerator.MoveNext(); i++) { linuxDistros.Add(enumerator.Current); }
你之前的写法报错是因为GetLinuxVmDistros()返回的是整个镜像序列,不是单个VmDistribution类型的元素,自然不能直接Add到元素类型为VmDistribution的集合里。
内容的提问来源于stack exchange,提问作者FoxDeploy
相关产品推荐
相关产品推荐

