明智的做法是创建一个变量,以避免使用多次计数

本文关键字:变量 一个 创建 | 更新日期: 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()在循环中是无用的。

  1. 有人有一个关于在循环中编码的"正确方法"的建议。
  2. 在这种情况下,我的maybeCount变量无用吗?
  3. 您知道Count()是每次都计数还是只返回计数变量的内容?

明智的做法是创建一个变量,以避免使用多次计数

如果保证计数不会改变,那么这将停止多次计算计数的需要,当计数从可能需要一些时间来执行的方法中解析时,这将变得更加重要。

如果计数发生变化,则可能导致生成错误的结果。

回答你的问题。

  1. 你做的方式看起来很合理
  2. 如前所述,您的cnt变量意味着您不必在每次迭代中重复linq查询。
  3. 计数将在每次调用时确定,它没有内存用于计数是什么

注意:重要的是要注意,我正在谈论的Enumerable.Count方法。List<T>.Count是一个属性,它只能返回一个值

这要看情况;)

  1. 我不会使用循环。我会这样做:

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属性。