如何在C#ConcurrentQueue中更改值

时间:2017-02-20 00:01:55

标签: c# .net

我想更改/设置ConcurrentQueue中的一个值。 FixedSizedQueueConcurrentQueue。我认为主要问题是我必须尝试获取此ConcurrentQueue中的一个条目。任何建议......

private void CalculateABC(FixedSizedQueue<Bar> q)
{
    decimal sum = 0.0m;

    foreach (var item in q.Queue)
    {
        sum = sum + item.close;
    }

        decimal ABCvalue = decimal.Round(sum / q.Limit, 5);

        //I'm trying to set the value HERE.  
        //((Bar)(q.Queue)Items[19]).ABC = ABCvalue;

    }

3 个答案:

答案 0 :(得分:0)

private void CalculateABC(FixedSizedQueue<Bar> q)
{
  decimal sum = 0.0m;

  Bar item19 = null;
  int index = 0;
  foreach (var item in q.Queue)
  { 
    if (index++ == 19)
      item19 = item;
    sum = sum + item.close;
  }

  decimal ABCvalue = decimal.Round(sum / q.Limit, 5);

  //I'm trying to set the value HERE.  
  if (item19 != null)
    item19.ABC = ABCvalue;
}

答案 1 :(得分:0)

在我看来,你只需要这样做:

private void CalculateABC(FixedSizedQueue<Bar> q)
{
    q.Queue.Skip(19).First().ABC =
        decimal.Round(q.Queue.Sum(x => x.close) / q.Limit, 5);
}

显然,您必须确保您的队列至少有20个元素才能正常工作。

答案 2 :(得分:0)

虽然你可能想要使用队列而不是列表(或者在这种情况下是ConcurrentQueue而不是ConcurrentBag)重新评估,因为它不会提供随机访问(并且你需要枚举所有以前的元素才能到达你想要的那个)它仍然是一个IEnumerable,所以你可以使用LINQ来索引它,但是性能会很差,因为索引第1000个元素不需要去第一个元素+ 1000的地址但是要经过前面的每一个999元件。

在任何情况下,最简单的解决方案,如果你想坚持一个队列和索引它是替换你的

的例子
queue[19]

queue.ElementAt(19)

所以完整的例子是:

private void CalculateABC(FixedSizedQueue<Bar> q)
{
   // Replace your summing of each item's close property with a simple LINQ sum
   decimal sum = q.Queue.Sum(item=>item.close);

   decimal ABCvalue = decimal.Round(sum / q.Limit, 5);

   // No need for any casting, you're already working on generics, it's already a Bar, don't cast a Bar to a Bar
   q.Queue.ElementAt(19).ABC = ABCvalue;
}