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