【发布时间】:2021-11-12 13:37:01
【问题描述】:
我有一个 linq 查询,它返回几个环大小的计数。然而,即使它在某种程度上是可重复使用的,我想看看我是否可以改进它。
private async Task<RingSizeLettersDto> CountOfLettersByRingFingerAsync(Func<RingSize, string> selector)
{
var ringSizes = await _ringSizeRepository.Get();
RingSizeLettersDto ringSizeLetters = new RingSizeLettersDto();
ringSizeLetters.G = ringSizes.Where(x => selector(x) == "G").Count();
ringSizeLetters.H = ringSizes.Where(x => selector(x) == "H").Count();
ringSizeLetters.I = ringSizes.Where(x => selector(x) == "I").Count();
ringSizeLetters.J = ringSizes.Where(x => selector(x) == "J").Count();
ringSizeLetters.K = ringSizes.Where(x => selector(x) == "K").Count();
ringSizeLetters.L = ringSizes.Where(x => selector(x) == "L").Count();
ringSizeLetters.M = ringSizes.Where(x => selector(x) == "M").Count();
ringSizeLetters.N = ringSizes.Where(x => selector(x) == "N").Count();
ringSizeLetters.O = ringSizes.Where(x => selector(x) == "O").Count();
ringSizeLetters.P = ringSizes.Where(x => selector(x) == "P").Count();
ringSizeLetters.Q = ringSizes.Where(x => selector(x) == "Q").Count();
ringSizeLetters.R = ringSizes.Where(x => selector(x) == "R").Count();
ringSizeLetters.S = ringSizes.Where(x => selector(x) == "S").Count();
ringSizeLetters.T = ringSizes.Where(x => selector(x) == "T").Count();
ringSizeLetters.U = ringSizes.Where(x => selector(x) == "U").Count();
ringSizeLetters.V = ringSizes.Where(x => selector(x) == "V").Count();
ringSizeLetters.W = ringSizes.Where(x => selector(x) == "W").Count();
ringSizeLetters.X = ringSizes.Where(x => selector(x) == "X").Count();
ringSizeLetters.Y = ringSizes.Where(x => selector(x) == "Y").Count();
ringSizeLetters.Z = ringSizes.Where(x => selector(x) == "Z").Count();
ringSizeLetters.Z1 = ringSizes.Where(x => selector(x) == "Z1").Count();
ringSizeLetters.Z2 = ringSizes.Where(x => selector(x) == "Z2").Count();
ringSizeLetters.Z3 = ringSizes.Where(x => selector(x) == "Z3").Count();
ringSizeLetters.Z4 = ringSizes.Where(x => selector(x) == "Z4").Count();
ringSizeLetters.Z5 = ringSizes.Where(x => selector(x) == "Z5").Count();
ringSizeLetters.Z6 = ringSizes.Where(x => selector(x) == "Z6").Count();
ringSizeLetters.NA = ringSizes.Where(x => selector(x) == "N/A").Count();
return ringSizeLetters;
}
【问题讨论】:
-
也许在这种情况下,您最好循环一次
ringsizes并手动有条件地递增计数器?也就是说,如果性能是一个问题 -
在不了解您的具体用例的情况下,似乎可以更简洁地建模。它可以是 Dictionary
,其中 string 是字母,int 是计数。或者你可以有一个更通用的模型,而不是每个字母都有单独的属性,你只需要一个名为“Letter”(和 int count)的字符串。在这两种情况下,您都可以使用一个查询。 -
ringSizeLetters.Z6 = ringSizes.Count(x => selector(x) == "Z6")也可以
标签: c# .net linq coding-style