本例子实现了如何自定义线性节点集合,具体代码如下:
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");