2014-02-22 149 views
0

我有一个数组数组,每当我有一个新的数组可用时,我想将它添加到数组的后面。但是,一旦阵列数组达到30个元素,我希望最旧的数组被丢弃,并添加最新的数组。我似乎无法弄清楚这一点。下面是我在说明的一个例子,试图澄清。如何在C#中创建一个不断更新的数组?

int[30][] jagged; 
int[] updatingDataFeed; 

//updatingDataFeed is different at different times and updating the jagged array can 
//occur in an event handler that fires whenever the new data is ready 

*This is within the event handler 
jagged[0] = updatingDataFeed 

我无法弄清楚一旦你完全填充了更新数据馈送数组的锯齿状的30个元素后该做什么。当updatingDataFeed有31日时间的新元素,我想锯齿状的样子:

jagged[0] = updatingDataFeed31 
jagged[1] = updatingDataFeed2 
jagged[2] = updatingDataFeed3 
... 
jagged[28] = updatingDataFeed29 
jagged[29] = updatingDataFeed30 
+0

C5集合库有一个循环队列实现,如果你感兴趣:https://github.com/sestoft/C5/ –

回答

0
int nextIndex = 0; 

int count = 0; 


//When you make Initializations. 

count = count+1; 
if (count%30) = 0 
    nextIndex = 0; 

jagged[nextIndex++] = updatingDataFeed; 

由于要在顺序(0,1,2..)更新值你总是知道在端Ô f您需要返回到0索引的30个更新。因此,只要使用Module%运营商找到,如果你取得了30次的更新,如果是这样你只是数组索引重置回0这是最古老的人刚刚递增index.`

+0

一些解释会很好。 –

+0

@JanDvorak完成:) – Dexters

0

首先,你需要保持“下一个”数组索引的轨道填补。当你填充数组时,增加该索引,将其折回到0.

其次,这足以照顾你的其他问题。如果索引中已有其他内容,则新值将覆盖它。

尝试

int[30][] jagged; 
int[] updatingDataFeed; 
int nextIndex = 0; 

private void UpdateDataFeed() 
{ 
    jagged[nextIndex++] = updatingDataFeed; 
    if (nextIndex == 30) nextIndex = 0; 
} 
0

你显然有一种方式来跟踪哪些元素的你,所以你可以不断递增该值,然后使用modulus运营商始终保持低于30以下的值是模数运算符的使用的例子:

for (int i =0; i<100; i++) 
{ 
    Console.WriteLine(i % 30); 
} 
4

你真的需要使用Array?为什么不能在你定义的类中使用Queue,并暴露你想要的方法,并在该类内部保留逻辑。

像这样answer这里也许?

编辑:

我不知道你正在寻找一个循环队列有固定的大小。 我做了一个answer在这里你也可以通过按运行来测试它。

这是我为链接中的answer写的实现。

public class FixedSizedCircularQueue<T> 
{ 
    private int _maxSize; 
    private int _currentIndex; 
    private T[] _q; 

    public FixedSizedCircularQueue(int maxSize) 
    { 
     _maxSize = maxSize; 
     _currentIndex = 0; 
     _q = new T[_maxSize]; 
    } 

    public void Enqueue(T obj) 
    { 
     ResetIndexIfMaxSizeExceeded(); 
     _q[_currentIndex] = obj; 
     _currentIndex++; 

     //for debug 
     Console.WriteLine("index: " + _currentIndex + " object: " + obj); 
    } 

    private void ResetIndexIfMaxSizeExceeded() 
    { 
     if((_currentIndex % _maxSize) == 0) _currentIndex = 0; 
    } 
} 

这里是你将如何使用它

var testQueue = new FixedSizedCircularQueue<int>(10); 

for(var i = 0; i < 20; i++) 
{ 
    testQueue.Enqueue(i + 1); 
} 

这将输出这个与调试console.WriteLine()功能

index: 1 object: 1 
index: 2 object: 2 
index: 3 object: 3 
index: 4 object: 4 
index: 5 object: 5 
index: 6 object: 6 
index: 7 object: 7 
index: 8 object: 8 
index: 9 object: 9 
index: 10 object: 10 
index: 1 object: 11 
index: 2 object: 12 
index: 3 object: 13 
index: 4 object: 14 
index: 5 object: 15 
index: 6 object: 16 
index: 7 object: 17 
index: 8 object: 18 
index: 9 object: 19 
index: 10 object: 20 
0

您可以维护一个变量来保存在您添加索引新的可用数据馈送。你继续增加这个变量,一旦你超过了30,你将它重置为0.这可以通过模运算符很容易地完成。所以,如果你的mod是p并且对于任何给定的整数范围,你可以通过用p取模来将它们映射到范围{0..p-1}。

int[30][] jagged; 
int[] updatingDataFeed; 
int indexToAddNewFeedTo = 0; 

void addNewDataFeed() 
{ 
    jagged[indexToAddNewFeed] = updatingDataFeed; 
    indexToaddNewFeedTo = (indexToAddNewFeedTo + 1)%30; 
} 
相关问题