好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

C#如何自定义线性节点链表集合

本例子实现了如何自定义线性节点集合,具体代码如下:

?

using system;

using system.collections;

using system.collections.generic;

 

namespace linenodedemo

{

  class program

  {

   static void main( string [] args)

   {

    linenodecollection linenodes = new linenodecollection();

    linenodes.add( new linenode( "n1" ) { name = "microsoft" });

    linenodes.add( new linenode( "n2" ) { name = "lenovo" });

    linenodes.add( new linenode( "n3" ) { name = "apple" });

    linenodes.add( new linenode( "n4" ) { name = "china mobile" });

    console.writeline( "1、显示全部:" );

    linenodes. foreach (x => { console.writeline(x.name); });

    console.writeline( "2、删除编号为n2的元素:" );

    linenodes.remove( "n2" );

    linenodes. foreach (x => { console.writeline(x.name); });

    console.writeline( "3、删除索引为1的元素:" );

    linenodes.removeat(1);

    linenodes. foreach (x => { console.writeline(x.name); });

    console.writeline( "4、显示索引为0元素的名称:" );

    console.writeline(linenodes[0].name);

    console.writeline( "5、显示编号为n4元素的名称:" );

    console.writeline(linenodes[ "n4" ].name);

    console.writeline( "6、清空" );

    linenodes.clear();

    linenodes. foreach (x => { console.writeline(x.name); });

    console.readkey();

   }

  }

 

  static class utility

  {

   public static void foreach <t>( this ienumerable<t> source, action<t> action)

   {

    foreach (var r in source)

    {

     action(r);

    }

   }

  }

 

  class linenodecollection : ienumerable<linenode>

  {

   public ienumerator<linenode> getenumerator()

   {

    return new linenodeenumerator( this .firstlinenode);

   }

 

   ienumerator ienumerable.getenumerator()

   {

    return this .getenumerator();

   }

 

   public linenode this [ int index]

   {

    get

    {

     linenode _linenode= this .firstlinenode;

     for ( int i=0;i<=index;i++)

     {

      if (_linenode != null )

      {

       if (i<index)

       {

        _linenode = _linenode.next;

        continue ;

       }

       else

       {

        return _linenode;

       }

      }

      else break ;

     }

     throw new indexoutofrangeexception( "超出集合索引范围" );

    }

   }

 

   public linenode this [ string id]

   {

    get

    {

     linenode _linenode = this .firstlinenode;

     for ( int i = 0; i < this .count; i++)

     {

      if (_linenode.id == id)

      {

       return _linenode;

      }

      else

      {

       _linenode = _linenode.next;

      }

     }

     throw new indexoutofrangeexception( "未能在集合中找到该元素" );

    }

   }

 

   linenode firstlinenode;

   linenode lastlinenode;

   public void add(linenode linenode)

   {

    this .count++;

    if ( this .firstlinenode == null )

    {

     this .firstlinenode = linenode;

    }

    else

    {

     if ( this .firstlinenode.next == null )

     {

      linenode.previous = this .firstlinenode;

      this .firstlinenode.next = linenode;

      this .lastlinenode = this .firstlinenode.next;

     }

     else

     {

      linenode.previous = this .lastlinenode;

      this .lastlinenode.next = linenode;

      this .lastlinenode = this .lastlinenode.next;

     }

    }

   }

 

   public int count

   {

    private set ; get ;

   }

 

   public int indexof( string id)

   {

    linenode _linenode = this .firstlinenode;

    for ( int i = 0; i < this .count; i++)

    {

     if (_linenode.id == id)

     {

      return i;

     }

     else

     {

      _linenode = _linenode.next;

     }

    }

    throw new indexoutofrangeexception( "未能在集合中找到该元素" );

   }

 

   public void clear()

   {

    this .firstlinenode = null ;

    this .lastlinenode = null ;

    this .count = 0;

    this .getenumerator().reset();

   }

 

   public void removeat( int index)

   {

    if ( this .count < index) throw new invalidoperationexception( "超出集合索引范围" );

    linenode _currentlinenode = this [index];

    if (_currentlinenode.previous == null )

    {

     _currentlinenode = _currentlinenode.next;

     this .firstlinenode = _currentlinenode;

    }

    else

    {

     linenode _linenode = this .firstlinenode;

     for ( int i = 0; i <= index - 1; i++)

     {

      if (i < index - 1)

      {

       _linenode = _linenode.next;

       continue ;

      }

      if (i == index - 1)

      {

       if (_currentlinenode.next != null )

       {

        _linenode.next = _linenode.next.next;

       }

       else

       {

        this .lastlinenode = _linenode;

        _linenode.next = null ;

       }

       break ;

      }

     }

    }

    this .count--;

   }

 

   public void remove( string id)

   {

    int _index = this .indexof(id);

    this .removeat(_index);

   }

 

   public linenode toplinenode { get { return this .firstlinenode; } }

   public linenode lastlinenode { get { return this .lastlinenode; } }

  }

 

  class linenodeenumerator : ienumerator<linenode>

  {

   linenode toplinenode;

   public linenodeenumerator(linenode toplinenode)

   {

    this .toplinenode = toplinenode;

   }

   public linenode current

   {

    get

    {

     return this .linenode;

    }

   }

 

   object ienumerator.current

   {

    get

    {

     return this .current;

    }

   }

 

   public void dispose()

   {

    this .linenode = null ;

   }

 

   linenode linenode;

 

   public bool movenext()

   {

    if ( this .linenode == null )

    {

     this .linenode = this .toplinenode;

     if ( this .linenode == null ) return false ;

     if ( this .linenode.next == null )

      return false ;

     else

      return true ;

    }

    else

    {

     if ( this .linenode.next != null )

     {

      this .linenode = this .linenode.next;

      return true ;

     }

     return false ;

    }

   }

 

   public void reset()

   {

    this .linenode = null ;

   }

  }

 

 

  class linenode

  {

   public linenode( string id)

   {

    this .id = id;

   }

   public string id { private set ; get ; }

   public string name { set ; get ; }

   public linenode next { set ; get ; }

   public linenode previous { set ; get ; }

  }

}

注意:

①这里所谓的线性节点指定是每个节点之间通过关联前后节点,从而形成链接的节点;

②本示例完全由博主原创,转载请注明来处。

 运行结果如下:

示例下载地址: c#自定义线性节点链表集合

(请使用vs2015打开,如果为其他版本,请将program.cs中的内容复制到自己创建的控制台程序中)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。

dy("nrwz");

查看更多关于C#如何自定义线性节点链表集合的详细内容...

  阅读:45次