C# 下面的案例是如何执行的,我如何在内存和性能相关的环境中更有效地执行?

C# 下面的案例是如何执行的,我如何在内存和性能相关的环境中更有效地执行?,c#,linq,C#,Linq,案例1: 案例2: var lstUsers = MyProgram.GetUsres(); if(lstUsers.Any()){ string ExistingUser = lstUser.First().UserName; } 请帮助我了解哪种情况需要更多的时间和内存来运行上述代码 为什么?这将完全取决于您对MyProgram.GetUsres()的实现 如果此函数很昂贵,那么案例2将较慢,因为该函数将被调用两次。也就是说,这还取决于MyPRogram.GetUsres()的功

案例1:

案例2:

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);