以下案例如何执行以及如何更有效地将其与内存和性能相关联?

时间:2013-07-15 12:20:34

标签: c# linq

案例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;
}

请帮助我了解哪个案例需要更多时间和内存来运行上面的代码?

为什么?

2 个答案:

答案 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转换。