2014-02-22 44 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; 
} 
相關問題