From 37ac74db326b4fd473491e3885514a4a78dc0922 Mon Sep 17 00:00:00 2001 From: Marko Lahma Date: Tue, 29 Jul 2025 10:08:43 +0300 Subject: [PATCH] Remove some unnecessary LINQ usage --- .../Models/EnumTemplateModel.cs | 16 +++++---- .../Models/EnumTemplateModel.cs | 8 +++-- .../ValueGeneratorBase.cs | 5 ++- .../Converters/JsonInheritanceConverter.cs | 35 ++++++++++++------- .../Infrastructure/CollectionExtensions.cs | 31 ++++++++++++++++ .../Validation/JsonSchemaValidator.cs | 15 +++++--- 6 files changed, 80 insertions(+), 30 deletions(-) create mode 100644 src/NJsonSchema/Infrastructure/CollectionExtensions.cs diff --git a/src/NJsonSchema.CodeGeneration.CSharp/Models/EnumTemplateModel.cs b/src/NJsonSchema.CodeGeneration.CSharp/Models/EnumTemplateModel.cs index d3ae5aae7..60fa7d1f4 100644 --- a/src/NJsonSchema.CodeGeneration.CSharp/Models/EnumTemplateModel.cs +++ b/src/NJsonSchema.CodeGeneration.CSharp/Models/EnumTemplateModel.cs @@ -66,12 +66,15 @@ public IEnumerable Enums var value = _schema.Enumeration.ElementAt(i); if (value != null) { - var description = _schema.EnumerationDescriptions.Count > i ? - _schema.EnumerationDescriptions.ElementAt(i) : null; + var description = _schema.EnumerationDescriptions.Count > i + ? _schema.EnumerationDescriptions[i] + : null; + if (_schema.Type.IsInteger()) { - var name = _schema.EnumerationNames.Count > i ? - _schema.EnumerationNames.ElementAt(i) : "_" + value; + var name = _schema.EnumerationNames.Count > i + ? _schema.EnumerationNames[i] + : "_" + value; if (_schema.IsFlagEnumerable && TryGetInt64(value, out long valueInt64)) { @@ -100,8 +103,9 @@ public IEnumerable Enums } else { - var name = _schema.EnumerationNames.Count > i ? - _schema.EnumerationNames.ElementAt(i) : value.ToString(); + var name = _schema.EnumerationNames.Count > i + ? _schema.EnumerationNames[i] + : value.ToString(); entries.Add(new EnumerationItemModel { diff --git a/src/NJsonSchema.CodeGeneration.TypeScript/Models/EnumTemplateModel.cs b/src/NJsonSchema.CodeGeneration.TypeScript/Models/EnumTemplateModel.cs index 5134efa1d..f4fb209b2 100644 --- a/src/NJsonSchema.CodeGeneration.TypeScript/Models/EnumTemplateModel.cs +++ b/src/NJsonSchema.CodeGeneration.TypeScript/Models/EnumTemplateModel.cs @@ -55,10 +55,12 @@ public List Enums if (value != null) { var name = _schema.EnumerationNames.Count > i - ? _schema.EnumerationNames.ElementAt(i) + ? _schema.EnumerationNames[i] : _schema.Type.IsInteger() ? "_" + value : value.ToString()!; - var description = _schema.EnumerationDescriptions.Count > i ? - _schema.EnumerationDescriptions.ElementAt(i) : null; + + var description = _schema.EnumerationDescriptions.Count > i + ? _schema.EnumerationDescriptions[i] + : null; entries.Add(new EnumerationItemModel { diff --git a/src/NJsonSchema.CodeGeneration/ValueGeneratorBase.cs b/src/NJsonSchema.CodeGeneration/ValueGeneratorBase.cs index c16cebbce..0527afcff 100644 --- a/src/NJsonSchema.CodeGeneration/ValueGeneratorBase.cs +++ b/src/NJsonSchema.CodeGeneration/ValueGeneratorBase.cs @@ -7,7 +7,6 @@ //----------------------------------------------------------------------- using System.Globalization; -using System.Linq; using System.Text.RegularExpressions; namespace NJsonSchema.CodeGeneration @@ -97,9 +96,9 @@ protected virtual string GetEnumDefaultValue(JsonSchema schema, JsonSchema actua { var typeName = typeResolver.Resolve(actualSchema, false, typeNameHint); - var index = actualSchema.Enumeration.ToList().IndexOf(schema.Default); + var index = actualSchema.Enumeration.IndexOf(schema.Default); var enumName = index >= 0 && actualSchema.EnumerationNames?.Count > index - ? actualSchema.EnumerationNames.ElementAt(index) + ? actualSchema.EnumerationNames[index] : schema.Default?.ToString(); return typeName.Trim('?') + "." + _settings.EnumNameGenerator.Generate(index, enumName, schema.Default, actualSchema); diff --git a/src/NJsonSchema.NewtonsoftJson/Converters/JsonInheritanceConverter.cs b/src/NJsonSchema.NewtonsoftJson/Converters/JsonInheritanceConverter.cs index 6a9343b20..33c918207 100644 --- a/src/NJsonSchema.NewtonsoftJson/Converters/JsonInheritanceConverter.cs +++ b/src/NJsonSchema.NewtonsoftJson/Converters/JsonInheritanceConverter.cs @@ -253,10 +253,13 @@ protected virtual Type GetDiscriminatorType(JObject jObject, Type objectType, st var type = objectType; do { - var knownTypeAttributes = type.GetCustomAttributes(false) - .Where(a => a.GetType().Name == "KnownTypeAttribute"); - foreach (dynamic attribute in knownTypeAttributes) + foreach (dynamic attribute in type.GetCustomAttributes(inherit: false)) { + if (attribute.GetType().Name != "KnownTypeAttribute") + { + continue; + } + if (attribute.Type != null && attribute.Type.Name == discriminator) { return attribute.Type; @@ -286,22 +289,28 @@ protected virtual Type GetDiscriminatorType(JObject jObject, Type objectType, st private static Type? GetObjectSubtype(Type baseType, string discriminatorName) { - var jsonInheritanceAttributes = baseType - - .GetCustomAttributes(true) - .OfType(); + foreach (var a in baseType.GetCustomAttributes(inherit: true)) + { + if (a.Key == discriminatorName) + { + return a.Type; + } + } - return jsonInheritanceAttributes.SingleOrDefault(a => a.Key == discriminatorName)?.Type; + return null; } private static string? GetSubtypeDiscriminator(Type objectType) { - var jsonInheritanceAttributes = objectType - - .GetCustomAttributes(true) - .OfType(); + foreach (var a in objectType.GetCustomAttributes(inherit: true)) + { + if (a.Type == objectType) + { + return a.Key; + } + } - return jsonInheritanceAttributes.SingleOrDefault(a => a.Type == objectType)?.Key; + return null; } } } diff --git a/src/NJsonSchema/Infrastructure/CollectionExtensions.cs b/src/NJsonSchema/Infrastructure/CollectionExtensions.cs new file mode 100644 index 000000000..d4f33e5c4 --- /dev/null +++ b/src/NJsonSchema/Infrastructure/CollectionExtensions.cs @@ -0,0 +1,31 @@ +using System.Collections.Generic; +using System.Collections.ObjectModel; + +namespace NJsonSchema; + +internal static class CollectionExtensions +{ + public static int IndexOf(this ICollection collection, T item) + { + if (collection is List l) + { + return l.IndexOf(item); + } + + if (collection is Collection c) + { + return c.IndexOf(item); + } + + int index = 0; + foreach (var element in collection) + { + if (EqualityComparer.Default.Equals(element, item)) + { + return index; + } + index++; + } + return -1; // Item not found + } +} \ No newline at end of file diff --git a/src/NJsonSchema/Validation/JsonSchemaValidator.cs b/src/NJsonSchema/Validation/JsonSchemaValidator.cs index 83078b7da..b1b4225ba 100644 --- a/src/NJsonSchema/Validation/JsonSchemaValidator.cs +++ b/src/NJsonSchema/Validation/JsonSchemaValidator.cs @@ -518,15 +518,20 @@ private void ValidateArray(JToken token, JsonSchema schema, SchemaType schemaTyp private void ValidateAdditionalItems(JToken item, JsonSchema schema, SchemaType schemaType, int index, string? propertyPath, List errors) { - if (schema.Items.Count > 0) + var items = schema._items; + if (items.Count > 0) { var propertyIndex = $"[{index}]"; - if (schema.Items.Count > index) + if (items.Count > index) { - var error = TryCreateChildSchemaError(item, - schema.Items.ElementAt(index), + var error = TryCreateChildSchemaError( + item, + items[index], schemaType, - ValidationErrorKind.ArrayItemNotValid, propertyIndex, propertyPath + propertyIndex); + ValidationErrorKind.ArrayItemNotValid, + propertyIndex, + propertyPath + propertyIndex); + if (error != null) { errors.Add(error);