我有以下代码。 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();
答案 0 :(得分:2)
我个人遵循的口号是:“必须编写程序供人们阅读,而只能由偶然的机器来执行”(Harold Abelson。)使代码尽可能易读(然后才担心优化/效率/等(如果需要)。优化干净代码比清理优化代码要容易。
因此,在重要的可读性方面,我会说:分解它们!将LINQ语句分成多行,可以做一些非常有价值的事情:
var records = someLinqStatement;
var activeUserRecords = records.SomeLinqStatement;
var mostRecentUserRecords = activeUserRecords.SomeLinqStatement;
...它使您可以使用变量名来记录linq的内容。您正在使用它来提高代码的可读性。如果有的话,您分组过多(版本中的3行filteredTokens行中存在 lot 。)
尝试阅读您的同事会有什么:
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();
...是一场噩梦。到那时,我不再阅读代码,我正在慢慢尝试解密。