亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C# > 正文

C#集合遍歷時刪除和增加元素的方法

2020-01-24 01:04:40
字體:
來源:轉載
供稿:網友

本文實例講述了C#集合遍歷時刪除和增加元素的方法。分享給大家供大家參考,具體如下:

大多數時候,遍歷集合元素的時候并不需要對元素進行增加或者刪除操作,但有些時候則需要,比如,如果集合中盛放的元素是社會上所有的人,那么有人死亡則元素刪除,有人出生則是集合元素的增加。對于這種情況,遍歷不能按照原來那種方式去做了,而且C#中的集合對于這類有增刪動作的遍歷,也不支持foreach循環。

有三種辦法可以解決這一問題。

第一種方法:使用C#的LinkedList<>雙鏈表。我原來設想,把原來鏈表需要刪除的元素直接remove掉,那些新添加的元素,先裝入到一個臨時鏈表中,等循環結束,再用Add把臨時鏈表的頭結點添加到原來鏈表的尾部即可,這樣算法的復雜度也較低,但是,出乎意料的是,C#的雙鏈表,無法將屬于另外一個鏈表的結點添加到本鏈表中,其Next屬性也只讀。無奈,只能一邊循環,一邊在原鏈表尾端添加結點,這樣就需要標記處循環結束的位置,即需要在原來的未改動的鏈表的尾部結點處結束循環,而不是在改動后的鏈表的尾部結點處結束。這樣就要求在循環開始之前,先獲得尾部結點的引用。程序如下(鏈表中有0-29的整數值結點,遍歷時遇到3的整數倍,就在鏈表尾端添加一個0值結點,遇到2的整數倍就刪除結點)

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 集合遍歷時刪除或增加元素{  public partial class Form1 : Form  {    public Form1()    {      InitializeComponent();    }    private LinkedList<int> list = new LinkedList<int>();    //初始化,添加0-29的整數進入鏈表    private void button1_Click(object sender, EventArgs e)    {      for (int i = 0; i < 30; i++)      {        this.list.AddLast(i);      }    }    //遍歷鏈表,做如下操作:    //遇到能被3整除的,就在該鏈表后增加一個0元素,遇到能被2整除的就刪除該元素    private void button2_Click(object sender, EventArgs e)    {      LinkedListNode<int> nodeNow = this.list.First;//鏈表第一個元素      LinkedListNode<int> nodeLast = this.list.Last;//原鏈表的最后一個元素,循環結束的標記      LinkedListNode<int> nodeTmp;//臨時結點      //循環結束的條件是,等當前結點是原鏈表的最后一個結點      while (nodeNow != nodeLast)      {        //如果能被3整除時,則在鏈表后加一個0        if (nodeNow.Value % 3 == 0)        {          this.list.AddLast(0);        }        //如果能被2整除,則刪除該元素        if (nodeNow.Value % 2 == 0)        {          //如果nodeNow被刪除了,那么一定不能用Next獲取下一個要判斷的元素          //因為已經自動向下一個移動了,這是就要在刪除nodeNow之前,          //獲取它的Next,賦給nodeTmp,待nodeNow刪除之后,再把nodeTmp的內存賦給nodeNow          nodeTmp = nodeNow.Next;          this.list.Remove(nodeNow);          nodeNow = nodeTmp;        }        else        {          //如果不能被2整除,則在鏈表中保留該元素,并獲得下一個并進行判斷          nodeNow = nodeNow.Next;        }      }      //最后不要忘記對nodeLast(原鏈表最后一個元素)本身進行處理,上面的while循環沒有包括這個nodeLast      if (nodeNow.Value % 3 == 0)      {        this.list.AddLast(0);      }      if (nodeNow.Value % 2 == 0)      {        this.list.Remove(nodeNow);      }    }    //測試結果    private void button3_Click(object sender, EventArgs e)    {      foreach (int i in this.list)      {        Console.WriteLine(i);      }    }  }}
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 集合遍歷時刪除或增加元素{  public partial class Form1 : Form  {    public Form1()    {      InitializeComponent();    }    private LinkedList<int> list = new LinkedList<int>();    //初始化,添加0-29的整數進入鏈表    private void button1_Click(object sender, EventArgs e)    {      for (int i = 0; i < 30; i++)      {        this.list.AddLast(i);      }    }    //遍歷鏈表,做如下操作:    //遇到能被3整除的,就在該鏈表后增加一個0元素,遇到能被2整除的就刪除該元素    private void button2_Click(object sender, EventArgs e)    {      LinkedListNode<int> nodeNow = this.list.First;//鏈表第一個元素      LinkedListNode<int> nodeLast = this.list.Last;//原鏈表的最后一個元素,循環結束的標記      LinkedListNode<int> nodeTmp;//臨時結點      //循環結束的條件是,等當前結點是原鏈表的最后一個結點      while (nodeNow != nodeLast)      {        //如果能被3整除時,則在鏈表后加一個0        if (nodeNow.Value % 3 == 0)        {          this.list.AddLast(0);        }        //如果能被2整除,則刪除該元素        if (nodeNow.Value % 2 == 0)        {          //如果nodeNow被刪除了,那么一定不能用Next獲取下一個要判斷的元素          //因為已經自動向下一個移動了,這是就要在刪除nodeNow之前,          //獲取它的Next,賦給nodeTmp,待nodeNow刪除之后,再把nodeTmp的內存賦給nodeNow          nodeTmp = nodeNow.Next;          this.list.Remove(nodeNow);          nodeNow = nodeTmp;        }        else        {          //如果不能被2整除,則在鏈表中保留該元素,并獲得下一個并進行判斷          nodeNow = nodeNow.Next;        }      }      //最后不要忘記對nodeLast(原鏈表最后一個元素)本身進行處理,上面的while循環沒有包括這個nodeLast      if (nodeNow.Value % 3 == 0)      {        this.list.AddLast(0);      }      if (nodeNow.Value % 2 == 0)      {        this.list.Remove(nodeNow);      }    }    //測試結果    private void button3_Click(object sender, EventArgs e)    {      foreach (int i in this.list)      {        Console.WriteLine(i);      }    }  }}

第二種方法:使用C#的List<>,List<>是基于數組的順序表,增加、刪除動作時間復雜度較高,不如鏈表的效率高。其基本原來同第一種方法相似,也需要使用一個int型的變量標記原順序表的尾部元素,當刪除一個元素時,這個變量需要自減。代碼略。

第三種方法,自定義單鏈表泛型類(鏈表類見//www.49028c.com/article/87610.htm)。跟第一種方法比的好處,就是能夠靈活實現兩個鏈表的合并,只需要把第二個鏈表的頭結點設置成第一個鏈表的尾結點的Next的結點(或直接Add)就可以了。其實對于C#的雙鏈表,我并不是很清楚,為什么AddLast()方法,無法將一個鏈表的元素添加到另一個鏈表中,而只能添加一個不屬于任何鏈表的結點(有人說第一種方法,其實可以使用結點Clone,但是這樣無非還是增加算法的空間和時間復雜度,違背了使用鏈表的本意)。C#之所以不支持這種做法的原因可能是,MS擔心你加入的結點,位于一個環狀鏈表上,這樣會導致原鏈表的Last屬性、Count屬性等無法計算(形成死循環)。測試代碼如下:

//兩個鏈表的合并LinkedList<int> list = new LinkedList<int>();for (int i = 0; i < 10; i++){   list.Add(i);}LinkedList<int> list2 = new LinkedList<int>();for (int i = 10; i < 20; i++){   list2.Add(i);}list.Add(list2.Head);Node<int> n = list.Head;while(n!=null){   Console.WriteLine(n.Data);   n = n.Next;}Console.ReadLine();Console.WriteLine(list.GetLength());Console.ReadLine();//兩個鏈表的合并LinkedList<int> list = new LinkedList<int>();for (int i = 0; i < 10; i++){ list.Add(i);}LinkedList<int> list2 = new LinkedList<int>();for (int i = 10; i < 20; i++){ list2.Add(i);}list.Add(list2.Head);Node<int> n = list.Head;while(n!=null){ Console.WriteLine(n.Data); n = n.Next;}Console.ReadLine();Console.WriteLine(list.GetLength());Console.ReadLine();

更多關于C#相關內容感興趣的讀者可查看本站專題:《C#遍歷算法與技巧總結》、《C#程序設計之線程使用技巧總結》、《C#操作Excel技巧總結》、《C#中XML文件操作技巧匯總》、《C#常見控件用法教程》、《WinForm控件用法總結》、《C#數據結構與算法教程》、《C#數組操作技巧總結》及《C#面向對象程序設計入門教程

希望本文所述對大家C#程序設計有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲国产日韩欧美在线图片| 国产人妖伪娘一区91| 九九久久国产精品| 青青青国产精品一区二区| 亚洲成人三级在线| 日韩在线欧美在线国产在线| 日韩精品在线观| 茄子视频成人在线| 久久成人精品电影| 成人免费淫片aa视频免费| 久久噜噜噜精品国产亚洲综合| 国产精品一区二区电影| 尤物yw午夜国产精品视频| 久久久中文字幕| 按摩亚洲人久久| 成人伊人精品色xxxx视频| 久久99精品久久久久久噜噜| 欧美日韩成人网| 欧美精品久久久久久久免费观看| 精品视频久久久久久久| 日韩成人av网| 久久中文久久字幕| 欧美与黑人午夜性猛交久久久| 欧美国产在线视频| 狠狠综合久久av一区二区小说| 狠狠久久亚洲欧美专区| 久久免费成人精品视频| 狠狠色狠色综合曰曰| 欧美猛交ⅹxxx乱大交视频| 亚洲成人黄色在线| 欧美性xxxxhd| 国产精品欧美日韩久久| 午夜精品久久久99热福利| 欧洲精品久久久| 日本不卡高字幕在线2019| 日韩在线激情视频| 国产精品色午夜在线观看| 国产精品极品美女在线观看免费| 91精品视频在线播放| 欧美激情亚洲自拍| 日韩最新在线视频| 亚洲综合精品一区二区| 日韩欧美综合在线视频| 久久久免费精品视频| 亚洲欧美国产va在线影院| 国产日韩在线看| 日韩成人高清在线| 九九视频这里只有精品| 国产精品偷伦视频免费观看国产| 日韩av在线免费观看| 欧美福利视频在线观看| 国产精品高潮视频| 欧美一级大片视频| 欧美性xxxxxx| 亚洲男女自偷自拍图片另类| 欧美xxxx14xxxxx性爽| 狠狠色香婷婷久久亚洲精品| 亚洲欧洲高清在线| 色婷婷av一区二区三区在线观看| 久久久精品国产一区二区| 日韩av片电影专区| 国产精品久久久久av免费| 91精品久久久久久久久青青| 欧美国产日产韩国视频| 亚洲欧美日韩一区二区三区在线| 国产成人精品亚洲精品| 午夜剧场成人观在线视频免费观看| 国产视频亚洲视频| 国产日韩欧美综合| 亚洲福利在线看| 精品久久久一区| www欧美日韩| 久久99热精品这里久久精品| 亚洲影视九九影院在线观看| 国产91精品在线播放| 亚洲女人天堂成人av在线| 亚洲欧美三级在线| 91九色视频在线| 97人人模人人爽人人喊中文字| 国产成人精品日本亚洲专区61| 97色在线视频观看| 国产精品久久婷婷六月丁香| 国产精品美女久久久久久免费| 欧美日韩在线视频一区| 热99精品里视频精品| 欧美专区在线观看| 精品久久久久久中文字幕一区奶水| 亚洲专区国产精品| 亚洲社区在线观看| 4438全国亚洲精品在线观看视频| 国产精品久久91| 日韩精品免费电影| 欧美老少配视频| 欧美日韩午夜视频在线观看| 国产精品夜色7777狼人| 欧美日韩在线视频一区二区| 91高清视频免费观看| 日本人成精品视频在线| 成人精品一区二区三区电影免费| www高清在线视频日韩欧美| 欧美影院久久久| 欧美乱大交做爰xxxⅹ性3| 国内精品久久久久久中文字幕| 中文字幕久久精品| 亚洲欧美成人在线| 国产成人亚洲精品| 欧美限制级电影在线观看| 亚洲国产成人精品久久久国产成人一区| 亚州精品天堂中文字幕| 亚洲综合精品一区二区| 久久精品视频中文字幕| 欧美综合一区第一页| 粉嫩老牛aⅴ一区二区三区| 亚洲欧洲在线免费| 亚洲大胆人体av| 亚洲电影天堂av| 亚洲女同精品视频| 岛国视频午夜一区免费在线观看| 成人久久一区二区| 欧美一区二区三区……| 日本一区二区在线免费播放| 国产精品视频中文字幕91| 久久精品一本久久99精品| 欧美日韩亚洲一区二区| 精品久久香蕉国产线看观看亚洲| 亚洲激情电影中文字幕| 欧美三级免费观看| 欧美激情一区二区三区成人| 日韩亚洲国产中文字幕| 精品久久久国产精品999| 亚洲精品乱码久久久久久金桔影视| 日韩欧美亚洲一二三区| 精品久久久久久久大神国产| 一本一本久久a久久精品综合小说| 在线日韩第一页| 欧美国产日韩一区二区在线观看| 国产精品中文久久久久久久| 91青草视频久久| 在线观看国产欧美| 色爱av美腿丝袜综合粉嫩av| 97人人做人人爱| 国产欧美日韩视频| 国产精品成久久久久三级| 亚洲欧美日韩国产成人| 亚洲丝袜一区在线| 亚洲精品网站在线播放gif| 国产美女高潮久久白浆| 亚洲精品久久久久久久久久久久久| 一区二区三区黄色| 国产成人在线播放| 26uuu亚洲伊人春色| 91久久精品国产91久久| 精品国产电影一区| 性色av一区二区三区| 亚洲天堂网在线观看| 这里只有精品视频在线| 992tv成人免费影院| 1769国内精品视频在线播放| 美日韩在线视频| 狠狠色狠色综合曰曰| 欧美视频免费在线观看| 午夜欧美不卡精品aaaaa| 免费91麻豆精品国产自产在线观看| 欧美激情欧美激情|