C# 我应该使用Linq还是传统循环创建复杂的嵌套结构?
因此,在下面3个做同样事情的例子中,我真的倾向于第一个,但如果你能把它全部创建为一个表达式,那么这样做真的是过分了吗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
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”你更喜欢阅读和维护哪一个?你发现你的随机数不是那么随机吗?你正在创建许多随机实例。它们是从时钟开始播种的。如果下次你创建新的时钟时时钟没有移动…那么呢?它将被播种