我应该用Linq或传统循环创建复杂的嵌套结构吗?

本文关键字:嵌套 结构 复杂 创建 Linq 传统 循环 我应该 | 更新日期: 2023-09-27 18:18:38

所以在接下来的3个例子中我倾向于第一个但是这样做是不是太过了,是不是滥用了linq你可以把它们都创建成一个表达式

  var Rand = new Random();
        Hosts = "abcdef".Select(x =>
                    {
                        return new HostMachineToUpdate(x + "_Host",
                            Enumerable.Range(1, Rand.Next(3, 8))
                            .Select(y => new VirtualMachineToUpdate(x + y.ToString() + "_VM")).
                            ToList()
                            );
                    }
                )
                .ToList();
        //traditional
        Hosts = new List<HostMachineToUpdate>();
        for (int x = (int)'a'; x < (int)'e'; x++)
        {
            var Guests = new List<VirtualMachineToUpdate>();
            for (int y = 1; y < (new Random().Next(3, 8));y++ )
            {
                Guests.Add(new VirtualMachineToUpdate((char)x + y.ToString() + "_VM"));
            }
            Hosts.Add(new HostMachineToUpdate((char) x + "Host",Guests));
        }
        //very traditional.
        Hosts = new List<HostMachineToUpdate>();
        int lower = (int)'a';
        int upper = (int)'e';
        for (int x = lower; x < upper; x++)
        {
            List<VirtualMachineToUpdate> Guests = new List<VirtualMachineToUpdate>();
            int randomItemNum = new Random().Next(3, 8);
            for (int y = 1; y < randomItemNum; y++)
            {
                string vmname = (char)x + y.ToString() + "_VM";
                VirtualMachineToUpdate vm = new VirtualMachineToUpdate(vmname);
                Guests.Add(vm);
            }
            string hostname = (char)x + "Host";
            HostMachineToUpdate host = new HostMachineToUpdate(hostname, Guests);                
            Hosts.Add(host);
        }

我应该用Linq或传统循环创建复杂的嵌套结构吗?

我个人不喜欢你的传统解决方案中使用的cast 的数量。

所有的演员都需要吗?

这段(未经测试的)代码不也能做所需的吗?

    // traditional.
    Hosts = new List<HostMachineToUpdate>();
    foreach (char x in "abcd")
    {
        List<VirtualMachineToUpdate> Guests = new List<VirtualMachineToUpdate>();
        int randomItemNum = new Random().Next(3, 8);
        for (int y = 1; y < randomItemNum; y++)
        {
            Guests.Add(new VirtualMachineToUpdate(x + y.ToString() + "_VM"));
        }
        Hosts.Add(new HostMachineToUpdate(x + "Host", Guests));
    }

我更喜欢声明式方法,所以类似于第一个选项。但我宁愿使用c#语法。比如:

(from x in Enumerable.Range('a', 'e'-'a')
 select new HostMachineToUpdate(
    (char)x + "_Host",
    (from y in Enumerable.Range(1, new Random.Next(3,8))
     select new VirtualMachineToUpdate((char)x + y.ToString() + "_VM")).ToList())
 .ToList();

感觉很近。可能是一个缺失(或)。

如果您的每个解决方案执行得足够快,那么可以肯定地说,机器无法分辨这些选项之间的区别。

重要的考虑因素归结为代码对人类读者的表达或清晰程度,因为将来有人必须理解、调试或扩展代码。在上面的例子中,试试这个。让代码单独运行两周。当你返回时,决定哪个选项是最容易理解的。

对我自己来说,这是一个现实的检验。在过去,我一直为编写一些聪明的代码而自豪,但实际上,更简单的解决方案才是正确的解决方案。