0

情况1:

var lstUsers = MyProgram.GetUsres();

if(lstUsers.Any()){
    string ExistingUser = lstUser.First().UserName;
}

案例二:

if(MyProgram.GetUsres().Where(qry => qry.UserName.Lower("xyz").Any()){
    string ExistingUser = MyProgram.GetUsres().Where(qry => qry.UserName.Lower("xyz")).First().UserName;
}

请帮助我了解哪种情况可能需要更多时间和内存来运行上述代码?

为什么?

4

2 回答 2

0

最终,您似乎是在询问是否应该检查某事物的存在,并且仅在它存在时才获取它。我建议翻转逻辑以尝试获取一件事(这是 Any/Exists 的必要操作)并在找到时返回它,否则返回 null 。在这种情况下,只需使用 FirstOrDefault 并完全跳过 Any 检查,从而将您的迭代/数据库请求计数减少到 1 而不是 2。

顺便说一句,如果您对数据库执行此操作,大多数数据库都使用不区分大小写的字符串比较,因此您可以放弃 .Lower 转换。

于 2013-07-15T15:33:15.960 回答
0

这将完全取决于您的实施MyProgram.GetUsres();

如果这个函数很昂贵,那么情况 2 会更慢,因为该函数将被调用两次。话虽如此,这也取决于 MyPROgram.GetUsres() 的作用。如果它返回一个 IEnumerable() 计算成本很高,那么这个优势就消失了。

另一种方法是处理一次

var username = MyProgram.GetUsers()
                        .Select(x => x.Username)
                        .FirstOrDefault(x => x.UserName.Lower("xyz"));

用户名将是第一个匹配项或null不匹配项。

这是假设您的 Lower 函数返回一个布尔值,我假设它确实如此x.UserName.ToLower() =="xyz",如果是这样,那么您想要。

var username = MyProgram.GetUsers()
                        .Select(x => x.Username)
                        .FirstOrDefault(x => 
                              String.Compare(x,
                                             "xyz",
                                             StringComparison.OrdinalIgnoreCase) == 0);
于 2013-07-15T12:42:01.373 回答