@@ -143,7 +143,7 @@ private void BuildModel()
143143 {
144144 using ( BuildLog . InfoRegion ( nameof ( Strings . LogBuildingX ) , Strings . ActualModel ) ) {
145145 context . Model = new DomainModel ( ) ;
146- BuildTypes ( GetTypeBuildSequence ( ) . ToList ( ) ) ;
146+ BuildTypes ( GetTypeBuildSequence ( ) ) ;
147147 BuildAssociations ( ) ;
148148 FindAndMarkInboundAndOutboundTypes ( context ) ;
149149 IndexBuilder . BuildIndexes ( context ) ;
@@ -538,35 +538,38 @@ private Dictionary<TypeInfo,int> InitReferencesOfTypesDictionary(TypeInfoCollect
538538
539539 #region Topological sort helpers
540540
541- private static List < Node < Node < TypeDef > , object > > PrepareNodesForTopologicalSort ( IEnumerable < Node < TypeDef > > typeNodes )
541+ private IReadOnlyList < TypeDef > GetTypeBuildSequence ( )
542542 {
543- var nodes = new List < Node < Node < TypeDef > , object > > ( ) ;
544- foreach ( var typeNode in typeNodes ) {
545- var topoNode = new Node < Node < TypeDef > , object > ( typeNode ) ;
546- nodes . Add ( topoNode ) ;
547- }
548- var dict = nodes . ToDictionary ( o => o . Item ) ;
549- foreach ( var typeNode in typeNodes ) {
550- var tail = dict [ typeNode ] ;
551- foreach ( var head in typeNode . OutgoingEdges . Where ( static o => o . Weight == EdgeWeight . High ) . Select ( static o => o . Head ) . Distinct ( ) ) {
552- if ( head != typeNode ) {
553- dict [ head ] . AddConnection ( tail , null ) ;
554- }
555- }
556- }
557- return nodes ;
558- }
559-
560- private IEnumerable < TypeDef > GetTypeBuildSequence ( )
561- {
562- List < Node < Node < TypeDef > , object > > loops ;
563- var result = TopologicalSorter . Sort ( PrepareNodesForTopologicalSort ( context . DependencyGraph . Nodes ) , out loops )
543+ //.SortToList eliminates resizes (count is known within sorter) which will appear if use Sort().ToList()
544+ var result = TopologicalSorter . SortToList ( PrepareNodesForTopologicalSort ( context . DependencyGraph . Nodes ) , out var loops )
564545 ?? throw new DomainBuilderException ( string . Format (
565546 Strings . ExAtLeastOneLoopHaveBeenFoundInPersistentTypeDependenciesGraphSuspiciousTypesX ,
566547 loops . Select ( node => node . Item . Value . Name ) . ToCommaDelimitedString ( ) ) ) ;
567- var dependentTypes = result . Select ( static n => n . Value ) . ToList ( ) ;
548+
549+ var dependentTypes = result . Select ( static n => n . Value ) ;
568550 var independentTypes = context . ModelDef . Types . Except ( dependentTypes ) ;
569- return independentTypes . Concat ( dependentTypes ) ;
551+
552+ return independentTypes . Concat ( dependentTypes ) . ToArray ( context . ModelDef . Types . Count ) ;
553+
554+
555+ static List < Node < Node < TypeDef > , object > > PrepareNodesForTopologicalSort ( IEnumerable < Node < TypeDef > > typeNodes )
556+ {
557+ var nodes = new List < Node < Node < TypeDef > , object > > ( ) ;
558+ foreach ( var typeNode in typeNodes ) {
559+ var topoNode = new Node < Node < TypeDef > , object > ( typeNode ) ;
560+ nodes . Add ( topoNode ) ;
561+ }
562+ var dict = nodes . ToDictionary ( o => o . Item ) ;
563+ foreach ( var typeNode in typeNodes ) {
564+ var tail = dict [ typeNode ] ;
565+ foreach ( var head in typeNode . OutgoingEdges . Where ( static o => o . Weight == EdgeWeight . High ) . Select ( static o => o . Head ) . Distinct ( ) ) {
566+ if ( head != typeNode ) {
567+ _ = dict [ head ] . AddConnection ( tail , null ) ;
568+ }
569+ }
570+ }
571+ return nodes ;
572+ }
570573 }
571574
572575 #endregion
0 commit comments