From 77dc8ebed733fcc68583a2fb805132e5e763c919 Mon Sep 17 00:00:00 2001 From: Matt Nadareski Date: Mon, 23 Mar 2026 10:50:09 -0400 Subject: [PATCH] Separate out collections extensions Even though there are relatively few collections extensions right now, there is a relatively high chance that other extension will be used in the future. --- README.MD | 1 + .../DictionaryExtensionsTests.cs | 2 +- .../EnumerableExtensionsTests.cs | 2 +- ...reTools.Collections.Extensions.Test.csproj | 23 ++++++++++++++ .../DictionaryExtensions.cs | 2 +- .../EnumerableExtensions.cs | 2 +- .../ExtensionAttribute.cs | 9 ++++++ SabreTools.Collections.Extensions/README.MD | 8 +++++ .../SabreTools.Collections.Extensions.csproj | 31 +++++++++++++++++++ SabreTools.IO.Extensions/IOExtensions.cs | 1 + SabreTools.IO.Extensions/README.MD | 4 +-- .../SabreTools.IO.Extensions.csproj | 1 + SabreTools.IO.Meta/SabreTools.IO.Meta.csproj | 1 + SabreTools.IO.sln | 28 +++++++++++++++++ 14 files changed, 108 insertions(+), 7 deletions(-) rename {SabreTools.IO.Extensions.Test => SabreTools.Collections.Extensions.Test}/DictionaryExtensionsTests.cs (98%) rename {SabreTools.IO.Extensions.Test => SabreTools.Collections.Extensions.Test}/EnumerableExtensionsTests.cs (99%) create mode 100644 SabreTools.Collections.Extensions.Test/SabreTools.Collections.Extensions.Test.csproj rename {SabreTools.IO.Extensions => SabreTools.Collections.Extensions}/DictionaryExtensions.cs (95%) rename {SabreTools.IO.Extensions => SabreTools.Collections.Extensions}/EnumerableExtensions.cs (98%) create mode 100644 SabreTools.Collections.Extensions/ExtensionAttribute.cs create mode 100644 SabreTools.Collections.Extensions/README.MD create mode 100644 SabreTools.Collections.Extensions/SabreTools.Collections.Extensions.csproj diff --git a/README.MD b/README.MD index dce8d96..89c2f2a 100644 --- a/README.MD +++ b/README.MD @@ -10,6 +10,7 @@ Find the link to the Nuget package [here](https://www.nuget.org/packages/SabreTo Below are a list of the included namespaces with links to their README files: +- [SabreTools.Collections.Extensions](https://github.com/SabreTools/SabreTools.IO/tree/main/SabreTools.Collections.Extensions) - [SabreTools.IO](https://github.com/SabreTools/SabreTools.IO/tree/main/SabreTools.IO) - [SabreTools.IO.Compression](https://github.com/SabreTools/SabreTools.IO/tree/main/SabreTools.IO.Compression) - [SabreTools.IO.Extensions](https://github.com/SabreTools/SabreTools.IO/tree/main/SabreTools.IO.Extensions) diff --git a/SabreTools.IO.Extensions.Test/DictionaryExtensionsTests.cs b/SabreTools.Collections.Extensions.Test/DictionaryExtensionsTests.cs similarity index 98% rename from SabreTools.IO.Extensions.Test/DictionaryExtensionsTests.cs rename to SabreTools.Collections.Extensions.Test/DictionaryExtensionsTests.cs index 09120e9..20edec1 100644 --- a/SabreTools.IO.Extensions.Test/DictionaryExtensionsTests.cs +++ b/SabreTools.Collections.Extensions.Test/DictionaryExtensionsTests.cs @@ -1,7 +1,7 @@ using System.Collections.Generic; using Xunit; -namespace SabreTools.IO.Extensions.Test +namespace SabreTools.Collections.Extensions.Test { public class DictionaryExtensionsTests { diff --git a/SabreTools.IO.Extensions.Test/EnumerableExtensionsTests.cs b/SabreTools.Collections.Extensions.Test/EnumerableExtensionsTests.cs similarity index 99% rename from SabreTools.IO.Extensions.Test/EnumerableExtensionsTests.cs rename to SabreTools.Collections.Extensions.Test/EnumerableExtensionsTests.cs index 25afa05..fe09936 100644 --- a/SabreTools.IO.Extensions.Test/EnumerableExtensionsTests.cs +++ b/SabreTools.Collections.Extensions.Test/EnumerableExtensionsTests.cs @@ -7,7 +7,7 @@ using Xunit; #pragma warning disable IDE0060 // Remove unused parameter #pragma warning disable IDE0290 // Use primary constructor -namespace SabreTools.IO.Extensions.Test +namespace SabreTools.Collections.Extensions.Test { public class EnumerableExtensionsTests { diff --git a/SabreTools.Collections.Extensions.Test/SabreTools.Collections.Extensions.Test.csproj b/SabreTools.Collections.Extensions.Test/SabreTools.Collections.Extensions.Test.csproj new file mode 100644 index 0000000..dcef8f8 --- /dev/null +++ b/SabreTools.Collections.Extensions.Test/SabreTools.Collections.Extensions.Test.csproj @@ -0,0 +1,23 @@ + + + + net8.0;net9.0;net10.0 + false + latest + enable + true + CS0618 + + + + + + + + + + + + + + \ No newline at end of file diff --git a/SabreTools.IO.Extensions/DictionaryExtensions.cs b/SabreTools.Collections.Extensions/DictionaryExtensions.cs similarity index 95% rename from SabreTools.IO.Extensions/DictionaryExtensions.cs rename to SabreTools.Collections.Extensions/DictionaryExtensions.cs index d89b4b6..3f583e8 100644 --- a/SabreTools.IO.Extensions/DictionaryExtensions.cs +++ b/SabreTools.Collections.Extensions/DictionaryExtensions.cs @@ -1,6 +1,6 @@ using System.Collections.Generic; -namespace SabreTools.IO.Extensions +namespace SabreTools.Collections.Extensions { public static class DictionaryExtensions { diff --git a/SabreTools.IO.Extensions/EnumerableExtensions.cs b/SabreTools.Collections.Extensions/EnumerableExtensions.cs similarity index 98% rename from SabreTools.IO.Extensions/EnumerableExtensions.cs rename to SabreTools.Collections.Extensions/EnumerableExtensions.cs index b5745ee..bffd905 100644 --- a/SabreTools.IO.Extensions/EnumerableExtensions.cs +++ b/SabreTools.Collections.Extensions/EnumerableExtensions.cs @@ -1,7 +1,7 @@ using System; using System.Collections.Generic; -namespace SabreTools.IO.Extensions +namespace SabreTools.Collections.Extensions { public static class EnumerableExtensions { diff --git a/SabreTools.Collections.Extensions/ExtensionAttribute.cs b/SabreTools.Collections.Extensions/ExtensionAttribute.cs new file mode 100644 index 0000000..478ed8b --- /dev/null +++ b/SabreTools.Collections.Extensions/ExtensionAttribute.cs @@ -0,0 +1,9 @@ +#if NET20 + +namespace System.Runtime.CompilerServices +{ + [AttributeUsage(AttributeTargets.Assembly | AttributeTargets.Class | AttributeTargets.Method)] + internal sealed class ExtensionAttribute : Attribute { } +} + +#endif diff --git a/SabreTools.Collections.Extensions/README.MD b/SabreTools.Collections.Extensions/README.MD new file mode 100644 index 0000000..6af1ba2 --- /dev/null +++ b/SabreTools.Collections.Extensions/README.MD @@ -0,0 +1,8 @@ +# SabreTools.Collections.Extensions + +This library contains collection-related extensions. + +| Class | Description | +| --- | --- | +| `DictionaryExtensions` | Utility `Dictionary>` extensions commonly used in SabreTools projects. | +| `EnumerableExtensions` | Specialized enumeration wrapper functionality. | diff --git a/SabreTools.Collections.Extensions/SabreTools.Collections.Extensions.csproj b/SabreTools.Collections.Extensions/SabreTools.Collections.Extensions.csproj new file mode 100644 index 0000000..e43c160 --- /dev/null +++ b/SabreTools.Collections.Extensions/SabreTools.Collections.Extensions.csproj @@ -0,0 +1,31 @@ + + + + + net20;net35;net40;net452;net462;net472;net48;netcoreapp3.1;net5.0;net6.0;net7.0;net8.0;net9.0;net10.0;netstandard2.0;netstandard2.1 + true + true + latest + enable + true + snupkg + true + 1.9.1 + + + Matt Nadareski + Common collections extensions used by other SabreTools projects + Copyright (c) Matt Nadareski 2019-2026 + https://github.com/SabreTools/ + README.md + https://github.com/SabreTools/SabreTools.IO + git + collections dictionary enumerable + MIT + + + + + + + \ No newline at end of file diff --git a/SabreTools.IO.Extensions/IOExtensions.cs b/SabreTools.IO.Extensions/IOExtensions.cs index e0f31f5..c3d7776 100644 --- a/SabreTools.IO.Extensions/IOExtensions.cs +++ b/SabreTools.IO.Extensions/IOExtensions.cs @@ -2,6 +2,7 @@ using System.IO; using System.Text; using System.Text.RegularExpressions; +using SabreTools.Collections.Extensions; using SabreTools.Text.Compare; namespace SabreTools.IO.Extensions diff --git a/SabreTools.IO.Extensions/README.MD b/SabreTools.IO.Extensions/README.MD index 43fb992..b090dee 100644 --- a/SabreTools.IO.Extensions/README.MD +++ b/SabreTools.IO.Extensions/README.MD @@ -2,7 +2,7 @@ This library contains IO-related extensions with some functionality locked behind .NET version support. -Relies on functionality found in `SabreTools.IO.Matching`, `SabreTools.Numerics`, and `SabreTools.Text.Compare`. +Relies on functionality found in `SabreTools.Collections.Extensions`, `SabreTools.IO`, `SabreTools.IO.Matching`, `SabreTools.Numerics`, `SabreTools.Numerics.Extensions`, `SabreTools.Text.Compare`, and `SabreTools.Text.Extensions`. | Class | Description | | --- | --- | @@ -12,8 +12,6 @@ Relies on functionality found in `SabreTools.IO.Matching`, `SabreTools.Numerics` | `ByteArrayReaderExtensions` | Extensions to `byte[]` for specialized type reading. | | `ByteArrayWriterExtensions` | Extensions to `byte[]` for specialized type writing. | | `DateTimeExtensions` | `DateTime` conversion, specifically between standard and MS-DOS formats. | -| `DictionaryExtensions` | Utility `Dictionary>` extensions commonly used in SabreTools projects. | -| `EnumerableExtensions` | Specialized enumeration wrapper functionality. | | `IOExtensions` | Path, directory, and file extensions. | | `MarshalHelpers` | Internal-only reflection-based extensions used by some other extension classes. | | `ParentablePathExtensions` | Extensions to `SabreTools.IO.ParentablePath` for filtering. | diff --git a/SabreTools.IO.Extensions/SabreTools.IO.Extensions.csproj b/SabreTools.IO.Extensions/SabreTools.IO.Extensions.csproj index 8ceac15..ae8acfc 100644 --- a/SabreTools.IO.Extensions/SabreTools.IO.Extensions.csproj +++ b/SabreTools.IO.Extensions/SabreTools.IO.Extensions.csproj @@ -30,6 +30,7 @@ + diff --git a/SabreTools.IO.Meta/SabreTools.IO.Meta.csproj b/SabreTools.IO.Meta/SabreTools.IO.Meta.csproj index a76265a..37daf5c 100644 --- a/SabreTools.IO.Meta/SabreTools.IO.Meta.csproj +++ b/SabreTools.IO.Meta/SabreTools.IO.Meta.csproj @@ -31,6 +31,7 @@ + diff --git a/SabreTools.IO.sln b/SabreTools.IO.sln index cba2f75..e41ecc7 100644 --- a/SabreTools.IO.sln +++ b/SabreTools.IO.sln @@ -55,6 +55,10 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SabreTools.Numerics.Extensi EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SabreTools.Numerics.Extensions.Test", "SabreTools.Numerics.Extensions.Test\SabreTools.Numerics.Extensions.Test.csproj", "{058292DF-E791-4206-9F67-DBCD76BB284C}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SabreTools.Collections.Extensions", "SabreTools.Collections.Extensions\SabreTools.Collections.Extensions.csproj", "{BAEF98B9-BF0F-47E3-993E-5FDD37B71193}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SabreTools.Collections.Extensions.Test", "SabreTools.Collections.Extensions.Test\SabreTools.Collections.Extensions.Test.csproj", "{C32AA0AE-46ED-49CE-9E4F-84B45130D2CE}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -377,6 +381,30 @@ Global {058292DF-E791-4206-9F67-DBCD76BB284C}.Release|x64.Build.0 = Release|Any CPU {058292DF-E791-4206-9F67-DBCD76BB284C}.Release|x86.ActiveCfg = Release|Any CPU {058292DF-E791-4206-9F67-DBCD76BB284C}.Release|x86.Build.0 = Release|Any CPU + {BAEF98B9-BF0F-47E3-993E-5FDD37B71193}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {BAEF98B9-BF0F-47E3-993E-5FDD37B71193}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BAEF98B9-BF0F-47E3-993E-5FDD37B71193}.Debug|x64.ActiveCfg = Debug|Any CPU + {BAEF98B9-BF0F-47E3-993E-5FDD37B71193}.Debug|x64.Build.0 = Debug|Any CPU + {BAEF98B9-BF0F-47E3-993E-5FDD37B71193}.Debug|x86.ActiveCfg = Debug|Any CPU + {BAEF98B9-BF0F-47E3-993E-5FDD37B71193}.Debug|x86.Build.0 = Debug|Any CPU + {BAEF98B9-BF0F-47E3-993E-5FDD37B71193}.Release|Any CPU.ActiveCfg = Release|Any CPU + {BAEF98B9-BF0F-47E3-993E-5FDD37B71193}.Release|Any CPU.Build.0 = Release|Any CPU + {BAEF98B9-BF0F-47E3-993E-5FDD37B71193}.Release|x64.ActiveCfg = Release|Any CPU + {BAEF98B9-BF0F-47E3-993E-5FDD37B71193}.Release|x64.Build.0 = Release|Any CPU + {BAEF98B9-BF0F-47E3-993E-5FDD37B71193}.Release|x86.ActiveCfg = Release|Any CPU + {BAEF98B9-BF0F-47E3-993E-5FDD37B71193}.Release|x86.Build.0 = Release|Any CPU + {C32AA0AE-46ED-49CE-9E4F-84B45130D2CE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C32AA0AE-46ED-49CE-9E4F-84B45130D2CE}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C32AA0AE-46ED-49CE-9E4F-84B45130D2CE}.Debug|x64.ActiveCfg = Debug|Any CPU + {C32AA0AE-46ED-49CE-9E4F-84B45130D2CE}.Debug|x64.Build.0 = Debug|Any CPU + {C32AA0AE-46ED-49CE-9E4F-84B45130D2CE}.Debug|x86.ActiveCfg = Debug|Any CPU + {C32AA0AE-46ED-49CE-9E4F-84B45130D2CE}.Debug|x86.Build.0 = Debug|Any CPU + {C32AA0AE-46ED-49CE-9E4F-84B45130D2CE}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C32AA0AE-46ED-49CE-9E4F-84B45130D2CE}.Release|Any CPU.Build.0 = Release|Any CPU + {C32AA0AE-46ED-49CE-9E4F-84B45130D2CE}.Release|x64.ActiveCfg = Release|Any CPU + {C32AA0AE-46ED-49CE-9E4F-84B45130D2CE}.Release|x64.Build.0 = Release|Any CPU + {C32AA0AE-46ED-49CE-9E4F-84B45130D2CE}.Release|x86.ActiveCfg = Release|Any CPU + {C32AA0AE-46ED-49CE-9E4F-84B45130D2CE}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE