From 0fd1e57591d2ae8aeb328c4fefcaa0cc6a0d0413 Mon Sep 17 00:00:00 2001 From: Marko Lahma Date: Tue, 21 Nov 2023 15:47:56 +0200 Subject: [PATCH] Improve ClassTemplateModel performance --- .../CSharpGenerator.cs | 10 +++---- .../Models/ClassTemplateModel.cs | 26 +++++++++++++------ 2 files changed, 23 insertions(+), 13 deletions(-) diff --git a/src/NJsonSchema.CodeGeneration.CSharp/CSharpGenerator.cs b/src/NJsonSchema.CodeGeneration.CSharp/CSharpGenerator.cs index 72158ebbe..5d0d6a1bd 100644 --- a/src/NJsonSchema.CodeGeneration.CSharp/CSharpGenerator.cs +++ b/src/NJsonSchema.CodeGeneration.CSharp/CSharpGenerator.cs @@ -113,18 +113,18 @@ private CodeArtifact GenerateClass(JsonSchema schema, string typeName) { var model = new ClassTemplateModel(typeName, Settings, _resolver, schema, RootObject); - RenamePropertyWithSameNameAsClass(typeName, model.Properties); + RenamePropertyWithSameNameAsClass(typeName, model._properties); var template = Settings.TemplateFactory.CreateTemplate("CSharp", "Class", model); return new CodeArtifact(typeName, model.BaseClassName, CodeArtifactType.Class, CodeArtifactLanguage.CSharp, CodeArtifactCategory.Contract, template); } - private static void RenamePropertyWithSameNameAsClass(string typeName, IEnumerable properties) + private static void RenamePropertyWithSameNameAsClass(string typeName, List properties) { - var propertyModels = properties as PropertyModel[] ?? properties.ToArray(); PropertyModel? propertyWithSameNameAsClass = null; - foreach (var p in propertyModels) + for (var i = 0; i < properties.Count; i++) { + var p = properties[i]; if (p.PropertyName == typeName) { propertyWithSameNameAsClass = p; @@ -136,7 +136,7 @@ private static void RenamePropertyWithSameNameAsClass(string typeName, IEnumerab { var number = 1; var candidate = typeName + number; - while (propertyModels.Any(p => p.PropertyName == candidate)) + while (properties.Exists(p => p.PropertyName == candidate)) { number++; } diff --git a/src/NJsonSchema.CodeGeneration.CSharp/Models/ClassTemplateModel.cs b/src/NJsonSchema.CodeGeneration.CSharp/Models/ClassTemplateModel.cs index 3c1dc3187..784e97d3b 100644 --- a/src/NJsonSchema.CodeGeneration.CSharp/Models/ClassTemplateModel.cs +++ b/src/NJsonSchema.CodeGeneration.CSharp/Models/ClassTemplateModel.cs @@ -16,6 +16,8 @@ public class ClassTemplateModel : ClassTemplateModelBase private readonly CSharpTypeResolver _resolver; private readonly JsonSchema _schema; private readonly CSharpGeneratorSettings _settings; + internal readonly List _properties; + private readonly List _allProperties; /// Initializes a new instance of the class. /// Name of the type. @@ -32,19 +34,27 @@ public ClassTemplateModel(string typeName, CSharpGeneratorSettings settings, _settings = settings; ClassName = typeName; - Properties = _schema.ActualProperties.Values - .Where(p => !p.IsInheritanceDiscriminator) - .Select(property => new PropertyModel(this, property, _resolver, _settings)) - .ToArray(); + + var actualProperties = _schema.ActualProperties; + _properties = new List(actualProperties.Count); + foreach (var property in actualProperties.Values) + { + if (!property.IsInheritanceDiscriminator) + { + _properties.Add(new PropertyModel(this, property, _resolver, _settings)); + } + } if (schema.InheritedSchema != null) { BaseClass = new ClassTemplateModel(BaseClassName!, settings, resolver, schema.InheritedSchema, rootObject); - AllProperties = Properties.Concat(BaseClass.AllProperties).ToArray(); + _allProperties = new List(_properties.Count + BaseClass._allProperties.Count); + _allProperties.AddRange(_properties); + _allProperties.AddRange(BaseClass._allProperties); } else { - AllProperties = Properties; + _allProperties = _properties; } } @@ -87,10 +97,10 @@ public ClassTemplateModel(string typeName, CSharpGeneratorSettings settings, // string.Empty) : null; /// Gets the property models. - public IEnumerable Properties { get; } + public IEnumerable Properties => _properties; /// Gets the property models with inherited properties. - public IEnumerable AllProperties { get; } + public IEnumerable AllProperties => _allProperties; /// Gets a value indicating whether the class has description. public bool HasDescription => _schema is not JsonSchemaProperty &&