基于属性迭代和设置计数器的快速方法

本文关键字:计数器 设置 方法 迭代 于属性 属性 | 更新日期: 2023-09-27 17:58:47

我想遍历一个具有一些典型属性的自定义类的列表。该列表将是巨大的,并不断增长(从3000件开始,可能达到+10000件)

我正在阅读有关快速迭代和检查属性的最佳方法,因为我将填充一些计数器。

在.NET中,哪个循环运行得更快,';对于';或者';foreach';?

http://www.codearsenal.net/2013/12/csharp-multithreading-loop-parallel-for.html#.U09-qPl_vA0

但如果我需要遵循逻辑来检查这些属性。。。什么会更快?

目前我的代码如下:

  public void CalculateTotalCounters()
  {
     #region ParallelCounting
     countTotal = 0;
     countMapped = 0;
     countNotMapped = 0;
     countError = 0;
     errorFound = false;
     MyList.AsParallel().ForAll(acc =>
     {
        lock (this)
           ++countTotal;
        if (!string.IsNullOrEmpty(acc.isMapped))
        {
           lock (this)
              ++countMapped;
        }
        if (string.IsNullOrEmpty(acc.isMapped))
        {
           lock (this)
              ++countNotMapped;
        }
        if (acc.HasError || acc.NotUnique || acc.DefalutName || acc.DefaultValue)
        {
           lock (this)
           {
              ++countError;
              errorFound = true;
           }
        }
     });
     #endregion
  }

我知道isMapped的两个条件可能只在一个条件下,否则(这会影响锁定吗?)

谢谢。

基于属性迭代和设置计数器的快速方法

锁将扼杀从并行中获得的性能。

可以使用互锁增量http://msdn.microsoft.com/en-us/library/dd78zt0c(v=vs.110).aspx

Interlocked.Increment(countMapped)

而且你不需要数那么多东西。循环后,你可以计算一些:

countTotal = MyList.Count();
countNotMapped = countTotal - countMapped;
errorFound = errorCount > 0;

但无论你做什么,你都应该对此进行评测,即Time-it。你可以为此使用Stopwatch类。然后你可以尝试不同的方法,看看哪个更快。

然后你应该试试这些:

countMapped = MyList.Count(acc => istring.IsNullOrEmpty(acc.isMapped);
countMapped = MyList.AsParallel().Count(acc => istring.IsNullOrEmpty(acc.isMapped);