我想更改/设置ConcurrentQueue
中的一个值。 FixedSizedQueue
是ConcurrentQueue
。我认为主要问题是我必须尝试获取此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;
}
答案 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;
}