c# - 合并 linq 语句或离开
问题描述
我有以下代码。linq 语句应该合并还是保留原样?我通常喜欢打破它,但我团队中的一些成员喜欢单线。
想法?
var startDate = DateTime.UtcNow;
var endDate = startDate.AddDays(expirationDays);
var allTokens = await repository.Query<Domain.Models.AccessToken>()
.Where(x => !x.IsRevoked)
.ToListAsync()
.ConfigureAwait(false);
var filteredTokens = allTokens.GroupBy(x => x.ApplicationName)
.Select(y => y.OrderByDescending(z => z.ExpirationDate).FirstOrDefault())
.Where(x => x != null && ! x.IsRevoked && x.ExpirationDate >= startDate && x.ExpirationDate <= endDate);
return filteredTokens.Select(x => x.Id).ToList();
解决方案
就我个人而言,我遵循这样的口头禅,“程序必须写给人们阅读,并且只是偶然地让机器执行”(Harold Abelson。)使代码尽可能可读(然后才在需要时担心优化/效率/等)。优化干净的代码比清理优化的代码更容易。
所以在重要的可读性方面,我会说:Break them Up!将您的 LINQ 语句分成多行可以让您做一些非常有价值的事情:
var records = someLinqStatement;
var activeUserRecords = records.SomeLinqStatement;
var mostRecentUserRecords = activeUserRecords.SomeLinqStatement;
...它允许您使用变量名称来记录 linq 的内容。您正在使用它来提高代码的可读性。如果有的话,你分组的太多了(在你的版本中的 3 行过滤令牌行中发生了很多事情。)
尝试阅读您的同事会拥有的内容:
var allTokens = await repository.Query<Domain.Models.AccessToken>()
.Where(x => !x.IsRevoked)
.ToListAsync()
.ConfigureAwait(false)
.GroupBy(x => x.ApplicationName)
.Select(y => y.OrderByDescending(z => z.ExpirationDate).FirstOrDefault())
.Where(x => x != null && ! x.IsRevoked && x.ExpirationDate >= startDate && x.ExpirationDate <= endDate)
.Select(x => x.Id).ToList();
……真是一场噩梦。那时,我不再阅读代码,我正在慢慢尝试破译它。
推荐阅读
- continuous-integration - 如果依赖失败,则构建失败
- javascript - 带有多个和异步选项的 ui-select 问题
- asp.net-mvc - Tab 键不会移动到部分视图中的下一个文本框
- r - ggsurvplot:grDevices::col2rgb 中的错误(颜色,真)
- c# - 无法在 Xamarin iOS 项目中使用 Package Forms9Patch
- linkedin - LinkedIn API 能否用于自动收集有关人们当前工作、以前工作和教育的数据?
- python - 如何从 TensorFlow 中的检查点获取变量和 .pb 文件?
- java - 如何在Java中将字节数组写入二进制文件
- java - 具有空字段的 Java 比较器
- c++ - 模板类中的析构函数给出错误