我正在重构一些LINQ查询,并试图确定最有效的重构。
原始行是类似于:
的查询 static void Main() {
var list = new List<string> { "A", "BB", "CCC" };
var shortList = list.Any(name => name.Length == 1);
}
我可以将字符串长度检查重构为方法,如下所示:
static void Main() {
var list = new List<string> { "A", "BB", "CCC" };
var shortList = list.Any(name => IsShort(name));
}
private static bool IsShort(string name) {
return name.Length == 1;
}
或者,我可以将完整的Func重构为一个方法:
static void Main() {
var list = new List<string> { "A", "BB", "CCC" };
var shortList = list.Any(IsShortFunc());
}
private static Func<string, bool> IsShortFunc() {
return name => name.Length == 1;
}
问题是,哪个在运行时更有效?
答案 0 :(得分:3)
实际上,您可以比使用方法组转换构建委托更好:
static void Main() {
var list = new List<string> { "A", "BB", "CCC" };
var shortList = list.Any(IsShort);
}
private static bool IsShort(string name) {
return name.Length == 1;
}
这将比您的第一个解决方案具有更少的间接级别,并且它比您的第二个版本更具可读性(IMO)。如果你 没有考虑更高阶的函数,请不要:)
我希望效率的差异绝对微不足道。你应该专注于可读性,除非你有足够的证据表明最易读的解决方案表现不如你所需要的那样。
答案 1 :(得分:0)
在任何这些情况下,您基本上都在使用Func<string,bool>
。在您的查询开始执行的那一刻,您的委托已经可以使用了,如果您使用了匿名委托,命名方法,或者某个其他方法创建了同一个委托,则无关紧要。
第二个示例应该比其他示例略慢,因为您对IsShort
方法进行了多次调用。其他两个示例中也列出了相同的标准,因此您没有多次调用方法的开销。
在最后一个示例中,IsShortFunc()
方法仅被调用一次,并创建一个匿名委托,然后将其用于查询的其余部分。在这种情况下,这是一个不必要的抽象层次。
答案 2 :(得分:0)
还有另一种方法,你可以简单地说
static void Main() {
var list = new List<string> { "A", "BB", "CCC" };
var shortList = list.Any(IsShortFunc);
}
private static bool IsShortFunc(string name) {
return name.Length == 1;
}
但是,在所有情况下,我都会重视可读性和表现力而不是表现,所以我只选择你(以及其他人)最舒服阅读的解决方案。