案例1:
var lstUsers = MyProgram.GetUsres();
if(lstUsers.Any()){
string ExistingUser = lstUser.First().UserName;
}
案例2:
if(MyProgram.GetUsres().Where(qry => qry.UserName.Lower("xyz").Any()){
string ExistingUser = MyProgram.GetUsres().Where(qry => qry.UserName.Lower("xyz")).First().UserName;
}
请帮助我了解哪个案例需要更多时间和内存来运行上面的代码?
为什么?
答案 0 :(得分:0)
这将完全取决于您MyProgram.GetUsres();
如果此功能很昂贵,那么情况2将会变慢,因为该功能将被调用两次。这就是说它还取决于MyPRogram.GetUsres()的作用。如果它返回IEnumerable(),则计算成本很高,那么这个优势就会消失。
另一种方法是处理一次
var username = MyProgram.GetUsers()
.Select(x => x.Username)
.FirstOrDefault(x => x.UserName.Lower("xyz"));
用户名将是第一场比赛或null
不匹配。
这假设您的Lower函数返回bool,我假设它x.UserName.ToLower() =="xyz"
,如果是,那么你想要。
var username = MyProgram.GetUsers()
.Select(x => x.Username)
.FirstOrDefault(x =>
String.Compare(x,
"xyz",
StringComparison.OrdinalIgnoreCase) == 0);
答案 1 :(得分:0)
最终,您似乎在询问是否应该检查是否存在某个事物,并且仅在存在时才进行获取。我建议翻转逻辑来尝试获取一件事(这是Any / Exists的必要操作)并在找到时返回它,否则返回null。在这种情况下,只需使用FirstOrDefault并完全跳过Any检查,从而将迭代/数据库请求计数减少到1而不是2。
顺便说一句,如果您对数据库执行此操作,大多数数据库都使用不区分大小写的字符串比较,因此您可以删除.Lower转换。