明智的做法是创建一个变量,以避免使用多次计数
本文关键字:变量 一个 创建 | 更新日期: 2023-09-27 18:03:53
很多时候我都在这样的代码前面:
var maybe = 'some random linq query'
int maybeCount = maybe.Count();
List<KeyValuePair<int, Customer>> lst2scan = maybe.Take(8).ToList();
for (int k = 0; k < 8; k++)
{
if (k + 1 <= maybeCount) custlst[k].Customer = lst2scan[k].Value;
else custlst[k].Customer = new Customer();
}
每次我都有这样的代码。我问我,我必须创建一个变量来避免for-each计算Count()
吗?也许只有1个Count()
在循环中是无用的。
- 有人有一个关于在循环中编码的"正确方法"的建议。 在这种情况下,我的
- 您知道
Count()
是每次都计数还是只返回计数变量的内容?
maybeCount
变量无用吗?如果保证计数不会改变,那么这将停止多次计算计数的需要,当计数从可能需要一些时间来执行的方法中解析时,这将变得更加重要。
如果计数发生变化,则可能导致生成错误的结果。
回答你的问题。
- 你做的方式看起来很合理 如前所述,您的
- 计数将在每次调用时确定,它没有内存用于计数是什么
cnt
变量意味着您不必在每次迭代中重复linq查询。注意:重要的是要注意,我正在谈论的Enumerable.Count
方法。List<T>.Count
是一个属性,它只能返回一个值
这要看情况;)
- 我不会使用循环。我会这样做:
var maybe = 'some random linq query'
// if necessary clear list
custlst.Clear();
custlst.AddRange(maybe.Take(8).Select(p => p.Value));
custlst.AddRange(Enumerable.Range(0, 8 - custlst.Count).Select(i => new Customer()));
- 这取决于底层类型是List(实际上是Collection)还是简单的enumerable。Count的实现将查找一个预先计算的Count值并使用它。所以,如果你循环一个列表,变量几乎是无用的(仍然快一点,但我不认为这是相关的任何手段),如果你循环一个Linq查询,变量是推荐的,因为计数将循环整个枚举。
只是我的2c。
编辑:作为参考,您可以在https://github.com/dotnet/corefx/blob/master/src/System.Linq/src/System/Linq/Enumerable.cs(大约1489行)找到.Count()的源代码;如您所见,它检查ICollection,并使用预先计算的Count属性。