C# 下面的案例是如何执行的,我如何在内存和性能相关的环境中更有效地执行?
案例1: 案例2:C# 下面的案例是如何执行的,我如何在内存和性能相关的环境中更有效地执行?,c#,linq,C#,Linq,案例1: 案例2: var lstUsers = MyProgram.GetUsres(); if(lstUsers.Any()){ string ExistingUser = lstUser.First().UserName; } 请帮助我了解哪种情况需要更多的时间和内存来运行上述代码 为什么?这将完全取决于您对MyProgram.GetUsres()的实现 如果此函数很昂贵,那么案例2将较慢,因为该函数将被调用两次。也就是说,这还取决于MyPRogram.GetUsres()的功
var lstUsers = MyProgram.GetUsres();
if(lstUsers.Any()){
string ExistingUser = lstUser.First().UserName;
}
请帮助我了解哪种情况需要更多的时间和内存来运行上述代码
为什么?这将完全取决于您对
MyProgram.GetUsres()的实现代码>
如果此函数很昂贵,那么案例2将较慢,因为该函数将被调用两次。也就是说,这还取决于MyPRogram.GetUsres()的功能。如果它返回一个IEnumerable(),计算起来很昂贵,那么这个优势就消失了
另一种选择是处理一次
if(MyProgram.GetUsres().Where(qry => qry.UserName.Lower("xyz").Any()){
string ExistingUser = MyProgram.GetUsres().Where(qry => qry.UserName.Lower("xyz")).First().UserName;
}
用户名将是第一个匹配项,如果不匹配,则为null
这是假设您的Lower函数返回bool,我假设它返回x.UserName.ToLower()==“xyz”
,如果是这样的话
var username = MyProgram.GetUsers()
.Select(x => x.Username)
.FirstOrDefault(x => x.UserName.Lower("xyz"));
最终看来,你是在问是否应该检查一件东西的存在,并且只在它存在的情况下取它。我建议翻转逻辑,尝试获取一件事(这是任何/Exists的必要操作),并在找到时返回它,否则返回null。在这种情况下,只需使用FirstOrDefault并完全跳过Any检查,从而将迭代/数据库请求计数减少到1而不是2
另一方面,如果您对数据库执行此操作,大多数数据库都使用不区分大小写的字符串比较,因此您可以放弃.Lower转换。从逻辑上讲,对于初学者来说,它们完全不同……我想说,第二个将花费更多的时间和资源,因为您要执行两次查询。当然,这是假设案例1中的GetUsers()
将返回一个iQuery
,它不会一次返回所有数据。我怀疑这是否会编译:…。其中(qry=>qry.UserName.Lower(“xyz”).Any().First().UserName;
…as.Any()
返回一个bool
。您能仔细检查一下您的代码吗?@Madushan LINQ查询在.NET 4.5中为您缓存。假设在这里是这样的话..不会有太大的区别。不过,编译的更好。哎呀..我的错..对不起,我忘了。
var username = MyProgram.GetUsers()
.Select(x => x.Username)
.FirstOrDefault(x =>
String.Compare(x,
"xyz",
StringComparison.OrdinalIgnoreCase) == 0);