我不确定这里是否可以提出这类问题,但我只是想知道两个代码片段之间的区别。
当我在SO中浏览这些问题时,我发现这篇文章: How to find the number of HTML elements with a name that starts with a certain string in c#?
用户回答了这个问题:
var dictionary = Request.Form.Keys
.Cast<string>()
.Where(x => x.StartsWith("abc"))
.ToDictionary(x => x, x => Request.Form[x]);
返回一个字典,其中包含以“abc”开头的所有表单元素的键/值。
更新:可怜的OP正在使用.Net 2.0。所以这是老派的回答:
Dictionary<string, string> keys = new Dictionary<string, string>();
foreach (string key in request.Form.Keys)
{
if (key.StartsWith("abc"))
keys[key] = request.Form[key];
}
两者中的哪一个执行速度更快或更优化?我们应该永远不要使用旧的吗?
答案 0 :(得分:6)
这是“过度优化”的一个很好的例子。代码不是在内部循环中执行的,如果你对它进行分析,你会发现它远远低于应用程序执行时间的0.1%。
因此,在这种情况下,易读性,可靠性和可维护性是一个更大的问题。鉴于这两个片段都能可靠地完成这项工作,那么当你忘记这段代码是如何运作的时候,你想在9个月后阅读哪一段呢?
答案 1 :(得分:1)
性能差异可以忽略不计,不值得担心。它也可能因.NET的一个版本而异。
第一种方法更可取的原因是你要声明你想要什么,而不是如何计算它。一旦你习惯了这种编程风格,你可能会更喜欢它。
以这种方式声明它使以后更容易并行化(并且编译器可能更容易优化)。
有关声明性编程及其如何简化并行化的更多讨论,请参阅http://www.albahari.com/threading/part5.aspx。
[当然在这种情况下计算如此简单,你永远不会想要并行化它,但一般来说,当循环包含更复杂的代码时,你可能会这样做。]
答案 2 :(得分:0)
就Big O而言,它是等价的。无论哪种方式,这都是一种有效的一次通过算法。 LINQ版本可能会有一些轻微的开销,但它几乎相同,您应该根据可读性进行选择。
答案 3 :(得分:0)
同样的事情,只是新奇的。但它会以同样的方式有效地执行。