亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

 更新時間:2016年06月29日 15:00:58   作者:codingsilence  
這篇文章主要介紹了C#集合遍歷時刪除和增加元素的方法,結合實例形式分析了C#針對集合元素的遍歷、添加與刪除等操作實現(xiàn)方法與注意事項,需要的朋友可以參考下

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

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

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

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

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的整數(shù)進入鏈表
    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;//原鏈表的最后一個元素,循環(huán)結束的標記
      LinkedListNode<int> nodeTmp;//臨時結點
      //循環(huán)結束的條件是,等當前結點是原鏈表的最后一個結點
      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循環(huán)沒有包括這個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的整數(shù)進入鏈表
    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;//原鏈表的最后一個元素,循環(huán)結束的標記
      LinkedListNode<int> nodeTmp;//臨時結點
      //循環(huán)結束的條件是,等當前結點是原鏈表的最后一個結點
      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循環(huán)沒有包括這個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<>是基于數(shù)組的順序表,增加、刪除動作時間復雜度較高,不如鏈表的效率高。其基本原來同第一種方法相似,也需要使用一個int型的變量標記原順序表的尾部元素,當刪除一個元素時,這個變量需要自減。代碼略。

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

//兩個鏈表的合并
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#數(shù)據(jù)結構與算法教程》、《C#數(shù)組操作技巧總結》及《C#面向對象程序設計入門教程

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

相關文章

最新評論