大多數時候,遍歷集合元素的時候並不需要對元素進行增加或者刪除操作,但有些時候則需要,比如,如果集合中盛放的元素是社會上所有的人,那麼有人死亡則元素刪除,有人出生則是集合元素的增加。對於這種情況,遍歷不能按照原來那種方式去做了,而且c#中的集合對於這類有增刪動作的遍歷,也不支援foreach迴圈。
有三種辦法可以解決這一問題。
第一種方法:使用c#的linkedlist<>雙鏈表。我原來設想,把原來鍊錶需要刪除的元素直接remove掉,那些新新增的元素,先裝入到乙個臨時鍊錶中,等迴圈結束,再用add把臨時鍊錶的頭結點新增到原來鍊錶的尾部即可,這樣演算法的複雜度也較低,但是,出乎意料的是,c#的雙鏈表,無法將屬於另外乙個鍊錶的結點新增到本鍊錶中,其next屬性也唯讀。無奈,只能一邊迴圈,一邊在原鍊錶尾端新增結點,這樣就需要標記處迴圈結束的位置,即需要在原來的未改動的鍊錶的尾部結點處結束迴圈,而不是在改動後的鍊錶的尾部結點處結束。這樣就要求在迴圈開始之前,先獲得尾部結點的引用。程式如下(鍊錶中有0-29的整數值結點,遍歷時遇到3的整數倍,就在鍊錶尾端新增乙個0值結點,遇到2的整數倍就刪除結點)
view plaincopy to clipboardprint?
using system;
using system.collections.generic;
using system.componentmodel;
using system.data;
using system.drawing;
using system.linq;
using system.text;
using system.windows.forms;
namespace 集合遍歷時刪除或增加元素
private linkedlistlist = new linkedlist();
//初始化,新增0-29的整數進入鍊錶
private void button1_click(object sender, eventargs e)
}
//遍歷鍊錶,做如下操作:
//遇到能被3整除的,就在該鍊錶後增加乙個0元素,遇到能被2整除的就刪除該元素
private void button2_click(object sender, eventargs e)
//如果能被2整除,則刪除該元素
if (nodenow.value % 2 == 0)
else
}
//最後不要忘記對nodelast(原鍊錶最後乙個元素)本身進行處理,上面的while迴圈沒有包括這個nodelast
if (nodenow.value % 3 == 0)
if (nodenow.value % 2 == 0)
}
//測試結果
private void button3_click(object sender, eventargs e)
}
}
} using system;
using system.collections.generic;
using system.componentmodel;
using system.data;
using system.drawing;
using system.linq;
using system.text;
using system.windows.forms;
namespace 集合遍歷時刪除或增加元素
private linkedlistlist = new linkedlist();
//初始化,新增0-29的整數進入鍊錶
private void button1_click(object sender, eventargs e)
}//遍歷鍊錶,做如下操作:
//遇到能被3整除的,就在該鍊錶後增加乙個0元素,遇到能被2整除的就刪除該元素
private void button2_click(object sender, eventargs e)
//如果能被2整除,則刪除該元素
if (nodenow.value % 2 == 0)
else
}//最後不要忘記對nodelast(原鍊錶最後乙個元素)本身進行處理,上面的while迴圈沒有包括這個nodelast
if (nodenow.value % 3 == 0)
if (nodenow.value % 2 == 0)
}//測試結果
private void button3_click(object sender, eventargs e)}}
}第二種方法:使用c#的list<>,list<>是基於陣列的順序表,增加、刪除動作時間複雜度較高,不如鍊錶的效率高。其基本原來同第一種方法相似,也需要使用乙個int型的變數標記原順序表的尾部元素,當刪除乙個元素時,這個變數需要自減。**略。
第三種方法,自定義單鏈表泛型類(鍊錶類見跟第一種方法比的好處,就是能夠靈活實現兩個鍊錶的合併,只需要把第二個鍊錶的頭結點設定成第乙個鍊錶的尾結點的next的結點(或直接add)就可以了。其實對於c#的雙鏈表,我並不是很清楚,為什麼addlast()方法,無法將乙個鍊錶的元素新增到另乙個鍊錶中,而只能新增乙個不屬於任何鍊錶的結點(有人說第一種方法,其實可以使用結點clone,但是這樣無非還是增加演算法的空間和時間複雜度,違背了使用鍊錶的本意)。c#之所以不支援這種做法的原因可能是,ms擔心你加入的結點,位於乙個環狀鍊錶上,這樣會導致原鍊錶的last屬性、count屬性等無法計算(形成死迴圈)。測試**如下:
view plaincopy to clipboardprint?
//兩個鍊錶的合併
linkedlistlist = new linkedlist();
for (int i = 0; i < 10; i++)
linkedlistlist2 = new linkedlist();
for (int i = 10; i < 20; i++)
list.add(list2.head);
noden = list.head;
while(n!=null)
console.readline();
console.writeline(list.getlength());
console.readline();
//兩個鍊錶的合併
linkedlistlist = new linkedlist();
for (int i = 0; i < 10; i++)
linkedlistlist2 = new linkedlist();
for (int i = 10; i < 20; i++)
list.add(list2.head);
noden = list.head;
while(n!=null)
console.readline();
console.writeline(list.getlength());
console.readline();
JQuery的增加元素,刪除元素
let div elm elm 可以建立乙個div元素,並內容為elm prepend 方法會把元素新增到匹配元素最前面,類似原生js裡的insertbefore 內部新增元素後,生成的是父子關係 原來的 before 方法會把元素新增在匹配元素前面 原來的 after 方法會把元素新增在匹配元素後...
numpy刪除,插入,增加元素
刪除 numpy.delete arr,obj,axis none arr 輸入向量 obj 表明哪乙個子向量應該被移除。可以為整數或乙個int型的向量 axis 表明刪除哪個軸的子向量,若預設,則返回乙個被拉平的向量 a np.array np.arange 12 reshape 3,4 arra...
STL容器遍歷時刪除元素
stl容器遍歷時在迴圈體內刪除元素最容易出錯了,根本原因都是因為迭代器有效性問題,在此記下通用刪除方法,該方法適用於所有含erase成員函式的序列容器 1 std vectormyvec 23 std vector iterator it myvec.begin 4while it myvec.en...