📄 tree2.cs
字号:
using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Reflection;
using System.Diagnostics;
using System.Diagnostics.CodeAnalysis;
using System.IO;
using System.Runtime.Serialization;
using System.Xml;
using System.Xml.Serialization;
using System.Security.Permissions;
using MPEG7;
[assembly: SuppressMessage( "Microsoft.Performance", "CA1804:RemoveUnusedLocals", Scope = "member", Target = "Common.NodeTree`1+EnumeratorBase`1.Count", MessageId = "o" )]
[assembly: SuppressMessage( "Microsoft.Performance", "CA1804:RemoveUnusedLocals", Scope = "member", Target = "Common.NodeTree`1+BaseEnumerableCollectionPair+BaseNodesEnumerableCollection.Count", MessageId = "o" )]
[assembly: SuppressMessage( "Microsoft.Design", "CA1000:DoNotDeclareStaticMembersOnGenericTypes", Scope = "member", Target = "Common.NodeTree`1.GetNodeTree(Common.INode`1<T>):Common.NodeTree`1<T>" )]
[assembly: SuppressMessage( "Microsoft.Design", "CA1000:DoNotDeclareStaticMembersOnGenericTypes", Scope = "member", Target = "Common.NodeTree`1.GetNodeTree(Common.ITree`1<T>):Common.NodeTree`1<T>" )]
[assembly: SuppressMessage( "Microsoft.Design", "CA1000:DoNotDeclareStaticMembersOnGenericTypes", Scope = "member", Target = "Common.NodeTree`1.NewTree():Common.ITree`1<T>" )]
[assembly: SuppressMessage( "Microsoft.Design", "CA1000:DoNotDeclareStaticMembersOnGenericTypes", Scope = "member", Target = "Common.NodeTree`1.NewNode():Common.INode`1<T>" )]
[assembly: SuppressMessage( "Microsoft.Design", "CA1000:DoNotDeclareStaticMembersOnGenericTypes", Scope = "member", Target = "Common.NodeTree`1.XmlAdapterTag" )]
[assembly: SuppressMessage( "Microsoft.Design", "CA1000:DoNotDeclareStaticMembersOnGenericTypes", Scope = "member", Target = "Common.NodeTree`1.XmlDeserialize(System.IO.Stream):Common.ITree`1<T>" )]
[assembly: SuppressMessage( "Microsoft.Design", "CA1006:DoNotNestGenericTypesInMemberSignatures", Scope = "member", Target = "Common.IEnumerableCollectionPair`1.Nodes" )]
[assembly: SuppressMessage( "Microsoft.Design", "CA1006:DoNotNestGenericTypesInMemberSignatures", Scope = "member", Target = "Common.NodeTree`1.Nodes" )]
[assembly: SuppressMessage( "Microsoft.Design", "CA1006:DoNotNestGenericTypesInMemberSignatures", Scope = "member", Target = "Common.NodeTree`1+AllEnumerator.Nodes" )]
[assembly: SuppressMessage( "Microsoft.Design", "CA1006:DoNotNestGenericTypesInMemberSignatures", Scope = "member", Target = "Common.NodeTree`1+BaseEnumerableCollectionPair.Nodes" )]
[assembly: SuppressMessage( "Microsoft.Design", "CA1006:DoNotNestGenericTypesInMemberSignatures", Scope = "member", Target = "Common.NodeTree`1+BaseEnumerableCollectionPair+BaseNodesEnumerableCollection.GetEnumerator():System.Collections.Generic.IEnumerator`1<Common.INode`1<T>>" )]
[assembly: SuppressMessage( "Microsoft.Design", "CA1034:NestedTypesShouldNotBeVisible", Scope = "type", Target = "Common.NodeTree`1+AllEnumerator" )]
[assembly: SuppressMessage( "Microsoft.Design", "CA1034:NestedTypesShouldNotBeVisible", Scope = "type", Target = "Common.NodeTree`1+BaseEnumerableCollectionPair" )]
[assembly: SuppressMessage( "Microsoft.Design", "CA1034:NestedTypesShouldNotBeVisible", Scope = "type", Target = "Common.NodeTree`1+RootObject" )]
[assembly: SuppressMessage( "Microsoft.Design", "CA1034:NestedTypesShouldNotBeVisible", Scope = "type", Target = "Common.NodeTree`1+NodeXmlSerializationAdapter" )]
[assembly: SuppressMessage( "Microsoft.Design", "CA1034:NestedTypesShouldNotBeVisible", Scope = "type", Target = "Common.NodeTree`1+NodeXmlSerializationAdapter+IXmlCollection" )]
[assembly: SuppressMessage( "Microsoft.Design", "CA1034:NestedTypesShouldNotBeVisible", Scope = "type", Target = "Common.NodeTree`1+TreeXmlSerializationAdapter" )]
[assembly: SuppressMessage( "Microsoft.Design", "CA1063:ImplementIDisposableCorrectly", Scope = "member", Target = "Common.NodeTree`1.Dispose():System.Void" )]
[assembly: SuppressMessage( "Microsoft.Design", "CA1063:ImplementIDisposableCorrectly", Scope = "member", Target = "Common.NodeTree`1.Finalize():System.Void" )]
[assembly: SuppressMessage( "Microsoft.Design", "CA1063:ImplementIDisposableCorrectly", Scope = "member", Target = "Common.NodeTree`1+BaseEnumerableCollectionPair+BaseNodesEnumerableCollection.Dispose():System.Void" )]
[assembly: SuppressMessage( "Microsoft.Design", "CA1063:ImplementIDisposableCorrectly", Scope = "member", Target = "Common.NodeTree`1+BaseEnumerableCollectionPair+BaseNodesEnumerableCollection.Finalize():System.Void" )]
[assembly: SuppressMessage( "Microsoft.Usage", "CA2211:NonConstantFieldsShouldNotBeVisible", Scope = "member", Target = "Common.NodeTree`1.XmlAdapterTag" )]
[assembly: SuppressMessage( "Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly", Scope = "member", Target = "Common.NodeTree`1+NodeXmlSerializationAdapter.Children" )]
namespace Common
{
//--------------
//Node Value
public interface Node_value
{
void Node_value();
}
//-----------------------------------------------------------------------------
// IDeepCopy
public interface IDeepCopy
{
object CreateDeepCopy();
}
//-----------------------------------------------------------------------------
// IEnumerableCollection
public interface IEnumerableCollection<T> : IEnumerable<T>, ICollection
{
bool Contains( T item );
}
//-----------------------------------------------------------------------------
// IEnumerableCollectionPair
public interface IEnumerableCollectionPair<T>
{
IEnumerableCollection<INode<T>> Nodes { get; }
IEnumerableCollection<T> Values { get; }
}
//-----------------------------------------------------------------------------
// EventArgs
public class NodeTreeDataEventArgs<T> : EventArgs
{
private T _Data = default( T );
public T Data { get { return _Data; } }
public NodeTreeDataEventArgs( T data )
{
_Data = data;
}
}
public class NodeTreeNodeEventArgs<T> : EventArgs
{
private INode<T> _Node = null;
public INode<T> Node { get { return _Node; } }
public NodeTreeNodeEventArgs( INode<T> node )
{
_Node = node;
}
}
public enum NodeTreeInsertOperation
{
Previous,
Next,
Child,
Tree
}
public class NodeTreeInsertEventArgs<T> : EventArgs
{
private NodeTreeInsertOperation _Operation;
public NodeTreeInsertOperation Operation { get { return _Operation; } }
private INode<T> _Node = null;
public INode<T> Node { get { return _Node; } }
public NodeTreeInsertEventArgs( NodeTreeInsertOperation operation, INode<T> node )
{
_Operation = operation;
_Node = node;
}
}
//-----------------------------------------------------------------------------
// INode<T>
public interface INode<T> : IEnumerableCollectionPair<T>, IDisposable//, ICollection<T>
{
T Data { get; set; }
string ToStringRecursive();
int Depth { get; }
int BranchIndex { get; }
int BranchCount { get; }
int Count { get; }
int DirectChildCount { get; }
INode<T> Parent { get; }
INode<T> Previous { get; }
INode<T> Next { get; }
INode<T> Child { get; }
ITree<T> Tree { get; }
INode<T> Root { get; }
INode<T> Top { get; }
INode<T> First { get; }
INode<T> Last { get; }
INode<T> LastChild { get; }
MPEG7.frame _frame { get;set;}
MPEG7.shot _shot { get;set;}
MPEG7.story _story { get;set;}
bool IsTree { get; }
bool IsRoot { get; }
bool IsTop { get; }
bool HasParent { get; }
bool HasPrevious { get; }
bool HasNext { get; }
bool HasChild { get; }
bool IsFirst { get; }
bool IsLast { get; }
INode<T> this[ T item ] { get; }
bool Contains( INode<T> item );
bool Contains( T item );
INode<T> InsertPrevious( T o );
INode<T> InsertNext( T o );
INode<T> InsertChild( T o );
INode<T> Add( T o );
INode<T> AddChild( T o );
void InsertPrevious( ITree<T> tree );
void InsertNext( ITree<T> tree );
void InsertChild( ITree<T> tree );
void Add( ITree<T> tree );
void AddChild( ITree<T> tree );
ITree<T> Cut( T o );
ITree<T> Copy( T o );
ITree<T> DeepCopy( T o );
bool Remove( T o );
ITree<T> Cut();
ITree<T> Copy();
ITree<T> DeepCopy();
void Remove();
bool CanMoveToParent { get; }
bool CanMoveToPrevious { get; }
bool CanMoveToNext { get; }
bool CanMoveToChild { get; }
bool CanMoveToFirst { get; }
bool CanMoveToLast { get; }
void MoveToParent();
void MoveToPrevious();
void MoveToNext();
void MoveToChild();
void MoveToFirst();
void MoveToLast();
IEnumerableCollectionPair<T> All { get; }
IEnumerableCollectionPair<T> AllChildren { get; }
IEnumerableCollectionPair<T> DirectChildren { get; }
IEnumerableCollectionPair<T> DirectChildrenInReverse { get; }
event EventHandler<NodeTreeDataEventArgs<T>> Validate;
event EventHandler<NodeTreeDataEventArgs<T>> Setting;
event EventHandler<NodeTreeDataEventArgs<T>> SetDone;
event EventHandler<NodeTreeInsertEventArgs<T>> Inserting;
event EventHandler<NodeTreeInsertEventArgs<T>> Inserted;
event EventHandler Cutting;
event EventHandler CutDone;
event EventHandler<NodeTreeNodeEventArgs<T>> Copying;
event EventHandler<NodeTreeNodeEventArgs<T>> Copied;
event EventHandler<NodeTreeNodeEventArgs<T>> DeepCopying;
event EventHandler<NodeTreeNodeEventArgs<T>> DeepCopied;
}
//-----------------------------------------------------------------------------
// ITree<T>
public interface ITree<T> : IEnumerableCollectionPair<T>, IDisposable//, ICollection<T>
{
Type DataType { get; }
IEqualityComparer<T> DataComparer { get; set; }
void XmlSerialize( Stream stream );
void Clear();
int Count { get; }
int DirectChildCount { get; }
INode<T> Root { get; }
INode<T> this[ T o ] { get; }
string ToStringRecursive();
bool Contains( T item );
bool Contains( INode<T> item );
INode<T> InsertChild( T o );
INode<T> AddChild( T o );
void InsertChild( ITree<T> tree );
void AddChild( ITree<T> tree );
ITree<T> Cut( T o );
ITree<T> Copy( T o );
ITree<T> DeepCopy( T o );
bool Remove( T o );
ITree<T> Copy();
ITree<T> DeepCopy();
IEnumerableCollectionPair<T> All { get; }
IEnumerableCollectionPair<T> AllChildren { get; }
IEnumerableCollectionPair<T> DirectChildren { get; }
IEnumerableCollectionPair<T> DirectChildrenInReverse { get; }
event EventHandler<NodeTreeDataEventArgs<T>> Validate;
event EventHandler Clearing;
event EventHandler Cleared;
event EventHandler<NodeTreeDataEventArgs<T>> Setting;
event EventHandler<NodeTreeDataEventArgs<T>> SetDone;
event EventHandler<NodeTreeInsertEventArgs<T>> Inserting;
event EventHandler<NodeTreeInsertEventArgs<T>> Inserted;
event EventHandler Cutting;
event EventHandler CutDone;
event EventHandler<NodeTreeNodeEventArgs<T>> Copying;
event EventHandler<NodeTreeNodeEventArgs<T>> Copied;
event EventHandler<NodeTreeNodeEventArgs<T>> DeepCopying;
event EventHandler<NodeTreeNodeEventArgs<T>> DeepCopied;
}
//-----------------------------------------------------------------------------
// NodeTree
[Serializable]
public class NodeTree<T> : INode<T>, ITree<T>, ISerializable
{
private T _Data = default( T );
private NodeTree<T> _Parent = null;
private NodeTree<T> _Previous = null;
private NodeTree<T> _Next = null;
private NodeTree<T> _Child = null;
public MPEG7.frame framevalue = new MPEG7.frame();
public MPEG7.shot shotvalue = new MPEG7.shot();
public MPEG7.story storyvalue = new MPEG7.story();
public MPEG7.frame _frame
{
get { return framevalue; }
set { framevalue = value; }
}
public MPEG7.shot _shot
{
get { return shotvalue; }
set { shotvalue = value; }
}
public MPEG7.story _story
{
get { return storyvalue; }
set { storyvalue = value; }
}
protected NodeTree()
{ }
~NodeTree()
{
Dispose( false );
}
public void Dispose()
{
Dispose( true );
GC.SuppressFinalize( this );
}
protected virtual void Dispose( bool disposing )
{
if ( disposing )
{
if ( _EventHandlerList != null ) _EventHandlerList.Dispose();
}
}
//-----------------------------------------------------------------------------
// Instantiation
public static ITree<T> NewTree()
{
return new RootObject();
}
public static ITree<T> NewTree( IEqualityComparer<T> dataComparer )
{
return new RootObject( dataComparer );
}
protected static INode<T> NewNode()
{
return new NodeTree<T>();
}
protected virtual NodeTree<T> CreateTree()
{
return new RootObject();
}
protected virtual NodeTree<T> CreateNode()
{
return new NodeTree<T>();
}
//-----------------------------------------------------------------------------
// ToString
/// <summary>Obtains the <see cref="String"/> representation of this instance.</summary>
/// <returns>The <see cref="String"/> representation of this instance.</returns>
/// <remarks>
/// <p>
/// This method returns a <see cref="String"/> that represents this instance.
/// </p>
/// </remarks>
public override string ToString()
{
T data = Data;
if ( data == null ) return String.Empty;
return data.ToString();
}
public virtual string ToStringRecursive()
{
string s = String.Empty;
foreach ( NodeTree<T> node in All.Nodes )
s += new String( '\t', node.Depth ) + node + Environment.NewLine;
return s;
}
//-----------------------------------------------------------------------------
// Counts
public virtual int Depth
{
get
{
int i = -1;
for ( INode<T> node = this ; !node.IsRoot ; node = node.Parent ) i++;
return i;
}
}
public virtual int BranchIndex
{
get
{
int i = -1;
for ( INode<T> node = this ; node != null ; node = node.Previous ) i++;
return i;
}
}
public virtual int BranchCount
{
get
{
int i = 0;
for ( INode<T> node = First ; node != null ; node = node.Next ) i++;
return i;
}
}
//-----------------------------------------------------------------------------
// DeepCopyData
[ReflectionPermission( SecurityAction.Demand, Unrestricted = true )]
protected virtual T DeepCopyData( T data )
{
//if ( ! Root.IsTree ) throw new InvalidOperationException( "This is not a tree" );
if ( data == null ) { Debug.Assert( true ); return default( T ); }
// IDeepCopy
IDeepCopy deepCopy = data as IDeepCopy;
if ( deepCopy != null ) return ( T ) deepCopy.CreateDeepCopy();
// ICloneable
ICloneable cloneable = data as ICloneable;
if ( cloneable != null ) return ( T ) cloneable.Clone();
// Copy constructor
ConstructorInfo ctor = data.GetType().GetConstructor(
BindingFlags.Instance | BindingFlags.Public,
null, new Type[] { typeof( T ) }, null );
if ( ctor != null ) return ( T ) ctor.Invoke( new object[] { data } );
//return ( T ) Activator.CreateInstance( typeof( T ), new object[] { data } );
// give up
return data;
}
//-----------------------------------------------------------------------------
// RootObject
[Serializable]
protected class RootObject : NodeTree<T>
{
private int _Version = 0;
protected override int Version
{
get { return _Version; }
set { _Version = value; }
}
private IEqualityComparer<T> _DataComparer;
public override IEqualityComparer<T> DataComparer
{
get
{
if ( _DataComparer == null ) _DataComparer = EqualityComparer<T>.Default;
return _DataComparer;
}
set { _DataComparer = value; }
}
public RootObject()
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -