C# 这其中哪一个合成单元的性能更好?
以下哪种语法在数据之间搜索时具有更好的性能和速度 第一种选择:C# 这其中哪一个合成单元的性能更好?,c#,linq,premature-optimization,C#,Linq,Premature Optimization,以下哪种语法在数据之间搜索时具有更好的性能和速度 第一种选择: this.Message = pageContentsli .Where(m => m.PName == "Message") .First() .ContentValue; foreach (PageContentsModel pc in pageContentsli) { if (pc.PName == "Message"){ this.Message = pc.
this.Message = pageContentsli
.Where(m => m.PName == "Message")
.First()
.ContentValue;
foreach (PageContentsModel pc in pageContentsli)
{
if (pc.PName == "Message"){
this.Message = pc.ContentValue;
break;
}
}
第二种选择:
this.Message = pageContentsli
.Where(m => m.PName == "Message")
.First()
.ContentValue;
foreach (PageContentsModel pc in pageContentsli)
{
if (pc.PName == "Message"){
this.Message = pc.ContentValue;
break;
}
}
在继续比较之前,应先将条件移动到
内部,如下所示:
this.Message = pageContentsli.First(m => m.PName == "Message").ContentValue;
就性能而言,你应该看不出有什么不同。然而,在可读性方面,修改后的LINQ版本轻而易举地获胜。首先让我解释一下这两种语法的实际作用
在first语法(其中
)中,它逐个处理元素,如果捕捉到m.PName=“Message”
,它将请求的值返回给此.Message
,然后处理停止
在第二个语法(foreach
)中,它逐个处理元素,当捕捉到m.PName=“Message”
时,它将值分配给此.Message
,然后再次开始处理元素的其余部分
因此,即使找到了值,第二个语法不会停止,因此它比第一个语法需要更多的时间来完成。您是否有实际的性能问题?如果您有两匹马,您想知道这两匹马中哪一匹比您的马跑得快。在找到第一匹后,它们都会不必要地继续。foreach例如,当您通过实体框架访问数据源时,速度会慢得多,因为它会遍历所有项。LINQtoEntities将编写一个漂亮的WHERE查询。在这种情况下,答案总是:视情况而定,自己进行基准测试。-@Vogel612来源?例如,请参阅。@CodeCaster的讲话方向更为复杂。即使您是正确的,在简单循环中中断是可以接受的,并且更容易理解,但我要说的是,在不面对复杂(嵌套)循环中的使用问题时,很容易将“可接受”误认为“良好”。因此,我更喜欢称之为“坏习惯”或“最后手段”,因为代码可读性对OP有利。。。但是现在我的编辑时间用完了,我无法解决这个问题。…@motevallizadeh没问题-我编辑了答案,删除了不相关的部分。他说:“就性能而言,你应该看不到任何区别。”