Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我应该使用Linq还是传统循环创建复杂的嵌套结构?_C#_Linq_Coding Style - Fatal编程技术网

C# 我应该使用Linq还是传统循环创建复杂的嵌套结构?

C# 我应该使用Linq还是传统循环创建复杂的嵌套结构?,c#,linq,coding-style,C#,Linq,Coding Style,因此,在下面3个做同样事情的例子中,我真的倾向于第一个,但如果你能把它全部创建为一个表达式,那么这样做真的是过分了吗 var Rand = new Random(); Hosts = "abcdef".Select(x => { return new HostMachineToUpdate(x + "_Host", Enumer

因此,在下面3个做同样事情的例子中,我真的倾向于第一个,但如果你能把它全部创建为一个表达式,那么这样做真的是过分了吗

  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);
        }
var Rand=new Random();
Hosts=“abcdef”。选择(x=>
{
返回新主机更新(x+“\U主机”,
可枚举范围(1,Rand.Next(3,8))
.Select(y=>new VirtualMachine更新(x+y.ToString()+“_VM”))。
托利斯特()
);
}
)
.ToList();
//传统的
Hosts=新列表();
对于(int x=(int)'a';x<(int)'e';x++)
{
var Guests=新列表();
对于(int y=1;y<(new Random().Next(3,8));y++)
{
添加(新的VirtualMachineToUpdate((char)x+y.ToString()+“_VM”);
}
添加(新主机更新((char)x+“主机”,来宾));
}
//非常传统。
Hosts=新列表();
整数下限=(整数)“a”;
整数上限=(整数)'e';
用于(int x=下限;x<上限;x++)
{
列出来宾=新建列表();
int randomItemNum=new Random().Next(3,8);
对于(int y=1;y
我更喜欢声明式方法,因此类似于第一个选项。但我宁愿使用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();

感觉很近。可能是丢失的(或)

我更喜欢声明式方法,因此类似于第一个选项。但我宁愿使用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();

感觉很近。可能是丢失的(或)

如果每个解决方案的执行速度都足以满足您的需要,那么可以肯定地说,机器无法区分这些选项之间的差异

重要的考虑因素是代码对人类读者的表达能力或清晰程度,因为将来有人必须理解、调试或扩展代码。在上述情况下,请尝试此方法。把代码放两周。当您返回时,请决定哪些选项最容易理解


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

如果每个解决方案的执行速度都足以满足您的需要,那么可以肯定地说,机器无法区分这些选项之间的差异

重要的考虑因素是代码对人类读者的表达能力或清晰程度,因为将来有人必须理解、调试或扩展代码。在上述情况下,请尝试此方法。把代码放两周。当您返回时,请决定哪些选项最容易理解


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

我个人不喜欢传统解决方案中使用的铸造量

所有的演员都需要吗

这段(未经测试的)代码不也是必需的吗

    // 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));
    }
//传统的。
Hosts=新列表();
foreach(字符x在“abcd”中)
{
列出来宾=新建列表();
int randomItemNum=new Random().Next(3,8);
对于(int y=1;y
我个人不喜欢传统解决方案中使用的铸造量

所有的演员都需要吗

这段(未经测试的)代码不也是必需的吗

    // 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));
    }
//传统的。
Hosts=新列表();
foreach(字符x在“abcd”中)
{
列出来宾=新建列表();
int randomItemNum=new Random().Next(3,8);
对于(int y=1;y
您更喜欢阅读和维护哪一个?您是否发现您的随机数并不是那么随机?您正在创建许多随机实例。他们是从时钟开始播的。如果下次你买新的时钟还没动。。。然后呢?它将以与上次相同的值进行播种。使用单个随机实例,不要每次需要随机数时都创建新实例。(对我来说每次都是第一种形式,顺便说一句,自从Linq以来,我几乎没有进行过任何循环)我更喜欢第一种,因为可读性和可维护性,这是我在各种语言中的想法,但是我认为这会让不熟悉这类事情的同事等感到困惑。为了公平地比较三种解决方案,我建议更改(int x=(int)'a';x<(int)'e';x++)语句转换为foreach,这样就可以去掉其他两个方法中的(char)强制转换。另外,为什么第一个LINQ解决方案选择这些字符:“abcdef”,而两个for循环解决方案只选择这些字符:“abcd”你更喜欢阅读和维护哪一个?你发现你的随机数不是那么随机吗?你正在创建许多随机实例。它们是从时钟开始播种的。如果下次你创建新的时钟时时钟没有移动…那么呢?它将被播种