ktsu.Extensions 1.5.5

Prefix Reserved
dotnet add package ktsu.Extensions --version 1.5.5
                    
NuGet\Install-Package ktsu.Extensions -Version 1.5.5
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="ktsu.Extensions" Version="1.5.5" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="ktsu.Extensions" Version="1.5.5" />
                    
Directory.Packages.props
<PackageReference Include="ktsu.Extensions" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add ktsu.Extensions --version 1.5.5
                    
#r "nuget: ktsu.Extensions, 1.5.5"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#addin nuget:?package=ktsu.Extensions&version=1.5.5
                    
Install ktsu.Extensions as a Cake Addin
#tool nuget:?package=ktsu.Extensions&version=1.5.5
                    
Install ktsu.Extensions as a Cake Tool

ktsu.Extensions

A comprehensive utility library of extension methods for collections, strings, dictionaries, and reflection in .NET.

License NuGet NuGet Downloads Build Status GitHub Stars

Introduction

ktsu.Extensions is a utility library that enhances the functionality of standard .NET types through extension methods. It provides a wide range of utilities for explicit shallow and deep cloning, batch operations, string manipulations, and reflection helpers, making it easier to work with common data structures and types in a consistent, null-safe manner.

Features

  • Enumerable Extensions

    • WithIndex: Enumerates over an enumerable with the index of the item
    • ToCollection: Converts an enumerable to a collection
    • ForEach: Applies an action to each element of an enumerable
    • DeepClone/ShallowClone: Creates clones of a collection of items
    • AnyNull: Checks if the enumerable contains any null items
  • Collection Extensions

    • AddMany: Adds items from an enumerable to a collection
    • ReplaceWith: Replaces all items in a collection with items from an enumerable
    • ToStringCollection: Converts a collection to a collection of strings
  • Dictionary Extensions

    • GetOrCreate: Gets the value for a key or creates a new value if the key doesn't exist
    • AddOrReplace: Adds a new value or replaces an existing value
    • DeepClone/ShallowClone: Creates clones of a dictionary
  • String Extensions

    • As<TDest>: Converts between string types
    • Ordinal comparison helpers (StartsWithOrdinal, EndsWithOrdinal, ContainsOrdinal)
    • Prefix/suffix manipulation (RemoveSuffix, RemovePrefix)
    • Line ending utilities (DetermineLineEndings, NormalizeLineEndings)
  • Reflection Extensions

    • TryFindMethod: Searches for methods across inheritance hierarchies

Installation

Package Manager Console

Install-Package ktsu.Extensions

.NET CLI

dotnet add package ktsu.Extensions

Package Reference

<PackageReference Include="ktsu.Extensions" Version="x.y.z" />

Usage Examples

Enumerable Extensions

using ktsu.Extensions;

// Iterate with index
foreach (var (item, index) in myList.WithIndex())
{
    Console.WriteLine($"Item at position {index}: {item}");
}

// Apply action to each item
myList.ForEach(item => Console.WriteLine(item));

// Create clones
var deepClone = myList.DeepClone();
var shallowClone = myList.ShallowClone();

// Check for nulls
if (myList.AnyNull())
{
    Console.WriteLine("List contains null items");
}

String Extensions

using ktsu.Extensions;

string text = "Hello, World!";

// Ordinal string comparisons
if (text.StartsWithOrdinal("Hello"))
{
    Console.WriteLine("Text starts with 'Hello'");
}

// Prefix/suffix manipulation
string withoutPrefix = text.RemovePrefix("Hello, ");  // "World!"
string withoutSuffix = text.RemoveSuffix("!");        // "Hello, World"

// Line ending handling
string mixedText = "Line1\r\nLine2\nLine3";
var lineEndingStyle = mixedText.DetermineLineEndings();  // LineEndingStyle.Mixed
string normalized = mixedText.NormalizeLineEndings(LineEndingStyle.Unix);  // All \n

Dictionary Extensions

using ktsu.Extensions;

var cache = new Dictionary<string, List<string>>();

// Get or create a value
var items = cache.GetOrCreate("key", () => new List<string>());
items.Add("item1");

// Add or replace a value
cache.AddOrReplace("key2", new List<string> { "item2" });

// Clone the dictionary
var deepClone = cache.DeepClone();

Collection Extensions

using ktsu.Extensions;

var collection = new List<string>();

// Add multiple items at once
collection.AddMany(new[] { "item1", "item2", "item3" });

// Replace all items in the collection
collection.ReplaceWith(new[] { "new1", "new2" }); // Collection now contains only "new1" and "new2"

Advanced Usage

Working with StrongStrings

using ktsu.Extensions;
using ktsu.StrongStrings;

// Convert a regular string to a strong string
var strongId = "12345".As<ID>();

// Apply string extensions to strong strings
if (strongId.StartsWithOrdinal("123"))
{
    // Do something with the strong string
}

Null Item Handling

using ktsu.Extensions;

var items = new[] { "one", null, "three" };

// Convert to strings with null handling
var strings1 = items.ToStringEnumerable(NullItemHandling.Skip);       // ["one", "three"]
var strings2 = items.ToStringEnumerable(NullItemHandling.UseEmpty);   // ["one", "", "three"]
var strings3 = items.ToStringEnumerable(NullItemHandling.UseNull);    // ["one", null, "three"]
var strings4 = items.ToStringEnumerable(NullItemHandling.UseDefault); // ["one", "(null)", "three"]

Reflection Helpers

using ktsu.Extensions;
using System.Reflection;

// Find a method across inheritance hierarchy
if (someType.TryFindMethod("MethodName", BindingFlags.Instance | BindingFlags.Public, out var methodInfo))
{
    // Use the method info
    methodInfo.Invoke(instance, parameters);
}

API Reference

String Extensions

Method Description
As<TDest> Converts a string to a strong string type
StartsWithOrdinal Checks if string starts with value using ordinal comparison
EndsWithOrdinal Checks if string ends with value using ordinal comparison
ContainsOrdinal Checks if string contains value using ordinal comparison
RemovePrefix Removes a prefix from a string if present
RemoveSuffix Removes a suffix from a string if present
ReplaceOrdinal Replaces text using ordinal comparison
DetermineLineEndings Identifies line ending style in a string
NormalizeLineEndings Converts line endings to a specific style

Collection Extensions

Method Description
AddMany Adds multiple items to a collection
ReplaceWith Replaces all items in a collection with new items
AnyNull Checks if collection contains any null items
ToStringCollection Converts collection to string collection
WriteItemsToConsole Displays collection items in console

Dictionary Extensions

Method Description
GetOrCreate Gets existing value or creates new one
AddOrReplace Adds a new value or replaces existing one
DeepClone Creates a deep copy of the dictionary
ShallowClone Creates a shallow copy of the dictionary

Contributing

Contributions are welcome! Here's how you can help:

  1. Fork the repository
  2. Create your feature branch (git checkout -b feature/amazing-feature)
  3. Commit your changes (git commit -m 'Add some amazing feature')
  4. Push to the branch (git push origin feature/amazing-feature)
  5. Open a Pull Request

Please make sure to update tests as appropriate.

License

This project is licensed under the MIT License - see the LICENSE.md file for details.

Product Compatible and additional computed target framework versions.
.NET net8.0 is compatible.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed.  net9.0 is compatible.  net9.0-android was computed.  net9.0-browser was computed.  net9.0-ios was computed.  net9.0-maccatalyst was computed.  net9.0-macos was computed.  net9.0-tvos was computed.  net9.0-windows was computed.  net10.0 was computed.  net10.0-android was computed.  net10.0-browser was computed.  net10.0-ios was computed.  net10.0-maccatalyst was computed.  net10.0-macos was computed.  net10.0-tvos was computed.  net10.0-windows was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages (8)

Showing the top 5 NuGet packages that depend on ktsu.Extensions:

Package Downloads
ktsu.StrongPaths

A library that provides strong typing for common filesystem paths providing compile time feedback and runtime validation.

ktsu.ToStringJsonConverter

A JSON converter for System.Text.Json that handles ToString and Parse methods for value types.

ktsu.ImGuiStyler

A library for expressively styling ImGui.NET interfaces.

ktsu.ImGuiWidgets

A library of custom widgets using ImGui.NET and utilities to enhance ImGui-based applications.

ktsu.ImGuiPopups

A library for custom popups using ImGui.NET.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last updated
1.5.5 26 5/18/2025
1.5.4 26 5/18/2025
1.5.4-pre.15 31 5/17/2025
1.5.4-pre.14 111 5/16/2025
1.5.4-pre.13 179 5/15/2025
1.5.4-pre.12 181 5/14/2025
1.5.4-pre.11 184 5/13/2025
1.5.4-pre.10 212 5/12/2025
1.5.4-pre.9 149 5/11/2025
1.5.4-pre.8 95 5/10/2025
1.5.4-pre.7 31 5/9/2025
1.5.4-pre.6 104 5/8/2025
1.5.4-pre.5 111 5/7/2025
1.5.4-pre.4 102 5/6/2025
1.5.4-pre.3 109 5/5/2025
1.5.4-pre.2 107 5/4/2025
1.5.4-pre.1 107 5/4/2025
1.5.3 374 5/4/2025
1.5.3-pre.1 41 4/26/2025
1.5.2 439 4/25/2025
1.5.2-pre.1 105 4/4/2025
1.5.1 626 3/30/2025
1.5.0 1,430 3/30/2025
1.4.1 95 3/29/2025
1.4.1-pre.3 62 3/29/2025
1.4.1-pre.2 445 3/25/2025
1.4.1-pre.1 64 2/19/2025
1.4.0 3,245 2/18/2025
1.3.3-pre.5 63 2/17/2025
1.3.3-pre.4 64 2/11/2025
1.3.3-pre.3 72 2/6/2025
1.3.3-pre.2 59 2/5/2025
1.3.3-pre.1 60 2/5/2025
1.3.2 3,693 1/2/2025
1.3.2-pre.27 58 2/4/2025
1.3.2-pre.26 57 2/3/2025
1.3.2-pre.25 64 2/2/2025
1.3.2-pre.24 53 1/31/2025
1.3.2-pre.23 54 1/29/2025
1.3.2-pre.22 56 1/27/2025
1.3.2-pre.21 50 1/26/2025
1.3.2-pre.20 49 1/24/2025
1.3.2-pre.19 58 1/22/2025
1.3.2-pre.18 54 1/20/2025
1.3.2-pre.17 46 1/18/2025
1.3.2-pre.16 45 1/16/2025
1.3.2-pre.15 34 1/14/2025
1.3.2-pre.14 47 1/13/2025
1.3.2-pre.13 51 1/11/2025
1.3.2-pre.12 44 1/10/2025
1.3.2-pre.11 56 1/10/2025
1.3.2-pre.10 44 1/8/2025
1.3.2-pre.9 56 1/7/2025
1.3.2-pre.8 60 1/6/2025
1.3.2-pre.7 73 1/4/2025
1.3.2-pre.6 59 1/3/2025
1.3.2-pre.5 61 1/3/2025
1.3.2-pre.4 64 1/3/2025
1.3.2-pre.3 73 1/1/2025
1.3.2-pre.2 79 12/31/2024
1.3.2-pre.1 61 12/29/2024
1.3.1 2,976 12/28/2024
1.3.0 87 12/28/2024
1.2.16-pre.3 52 12/28/2024
1.2.16-pre.2 55 12/27/2024
1.2.16-pre.1 57 12/27/2024
1.2.15-pre.1 56 12/27/2024
1.2.14 901 12/26/2024
1.2.13 92 12/26/2024
1.2.12 90 12/26/2024
1.2.11 89 12/26/2024
1.2.10 89 12/26/2024
1.2.10-pre.1 55 12/27/2024
1.2.9 97 12/26/2024
1.2.8 2,592 12/26/2024
1.2.7 1,818 12/24/2024
1.2.6 490 12/23/2024
1.2.5 87 12/23/2024
1.2.4 441 12/22/2024
1.2.3 106 12/22/2024
1.2.2 141 12/22/2024
1.2.1 152 12/22/2024
1.2.0 629 12/19/2024
1.1.0 90 12/19/2024
1.0.37 537 12/13/2024
1.0.36 668 12/5/2024
1.0.35 340 12/4/2024
1.0.34 453 12/2/2024
1.0.33 90 12/2/2024
1.0.32 294 12/2/2024
1.0.31 422 12/1/2024
1.0.30 226 12/1/2024
1.0.29 91 12/1/2024
1.0.28 158 11/30/2024
1.0.27 274 11/28/2024
1.0.26 307 11/26/2024
1.0.25 1,104 11/14/2024
1.0.24 318 11/13/2024
1.0.23 815 11/2/2024
1.0.22 369 11/1/2024
1.0.21 1,056 10/16/2024
1.0.20 686 10/5/2024
1.0.19 228 10/4/2024
1.0.18 776 9/21/2024
1.0.17 279 9/19/2024
1.0.16 102 9/19/2024
1.0.15 278 9/19/2024
1.0.14 205 9/19/2024
1.0.13 210 9/19/2024
1.0.12 132 9/18/2024
1.0.11 112 9/18/2024
1.0.10 172 9/18/2024
1.0.9 634 9/18/2024
1.0.8 452 9/14/2024
1.0.7 130 9/14/2024

## v1.5.5 (patch)

Changes since v1.5.4:

- Fix icon ([@matt-edmondson](https://github.com/matt-edmondson))
## v1.5.4 (patch)

Changes since v1.5.3:

- Refactor: Remove unused namespaces and upgrade SDK ([@matt-edmondson](https://github.com/matt-edmondson))
- Add ReplaceWith method and related tests/documentation ([@matt-edmondson](https://github.com/matt-edmondson))
## v1.5.4-pre.15 (prerelease)

Changes since v1.5.4-pre.14:
## v1.5.4-pre.14 (prerelease)

Changes since v1.5.4-pre.13:
## v1.5.4-pre.13 (prerelease)

Changes since v1.5.4-pre.12:
## v1.5.4-pre.12 (prerelease)

Changes since v1.5.4-pre.11:
## v1.5.4-pre.11 (prerelease)

Changes since v1.5.4-pre.10:
## v1.5.4-pre.10 (prerelease)

Changes since v1.5.4-pre.9:
## v1.5.4-pre.9 (prerelease)

Changes since v1.5.4-pre.8:
## v1.5.4-pre.8 (prerelease)

Changes since v1.5.4-pre.7:
## v1.5.4-pre.7 (prerelease)

Changes since v1.5.4-pre.6:
## v1.5.4-pre.6 (prerelease)

Changes since v1.5.4-pre.5:
## v1.5.4-pre.5 (prerelease)

Changes since v1.5.4-pre.4:
## v1.5.4-pre.4 (prerelease)

Changes since v1.5.4-pre.3:
## v1.5.4-pre.3 (prerelease)

Changes since v1.5.4-pre.2:
## v1.5.4-pre.2 (prerelease)

Changes since v1.5.4-pre.1:
## v1.5.4-pre.1 (prerelease)

Incremental prerelease update.
## v1.5.3 (patch)

Changes since v1.5.2:

- Refactor project files and update DESCRIPTION. Changed project SDK references to ktsu.Sdk.Lib and ktsu.Sdk.Test, and revised DESCRIPTION to clarify the purpose of the library. ([@matt-edmondson](https://github.com/matt-edmondson))
- Remove obsolete build configuration files and update extension classes with copyright information. ([@matt-edmondson](https://github.com/matt-edmondson))
## v1.5.3-pre.1 (prerelease)

Incremental prerelease update.
## v1.5.2 (patch)

Changes since v1.5.1:

- Update README to match standard template format ([@matt-edmondson](https://github.com/matt-edmondson))
## v1.5.2-pre.1 (prerelease)

Incremental prerelease update.
## v1.5.1 (patch)

Changes since v1.5.0:

- Update packages ([@matt-edmondson](https://github.com/matt-edmondson))
## v1.5.0 (minor)

Changes since v1.4.0:

- Add LICENSE template ([@matt-edmondson](https://github.com/matt-edmondson))
- Update packages ([@matt-edmondson](https://github.com/matt-edmondson))
## v1.4.1 (patch)

Changes since v1.4.0:

- Update packages ([@matt-edmondson](https://github.com/matt-edmondson))
## v1.4.1-pre.3 (prerelease)

Changes since v1.4.1-pre.2:

- Sync scripts\make-changelog.ps1 ([@ktsu[bot]](https://github.com/ktsu[bot]))
- Sync scripts\make-version.ps1 ([@ktsu[bot]](https://github.com/ktsu[bot]))
## v1.4.1-pre.2 (prerelease)

Changes since v1.4.1-pre.1:

- Sync Directory.Build.targets ([@ktsu[bot]](https://github.com/ktsu[bot]))
- Sync scripts\make-changelog.ps1 ([@ktsu[bot]](https://github.com/ktsu[bot]))
- Sync .editorconfig ([@ktsu[bot]](https://github.com/ktsu[bot]))
- Sync .gitignore ([@ktsu[bot]](https://github.com/ktsu[bot]))
- Sync scripts\make-version.ps1 ([@ktsu[bot]](https://github.com/ktsu[bot]))
## v1.4.1-pre.1 (prerelease)

Incremental prerelease update.
## v1.4.0 (minor)

Changes since v1.3.0:

- Apply new editorconfig ([@matt-edmondson](https://github.com/matt-edmondson))
- Add mailmap ([@matt-edmondson](https://github.com/matt-edmondson))
- Add automation scripts for metadata management and versioning ([@matt-edmondson](https://github.com/matt-edmondson))
- Refactor LineEndingStyle enumeration to standalone ([@matt-edmondson](https://github.com/matt-edmondson))
## v1.3.3-pre.5 (prerelease)

Changes since v1.3.3-pre.4:

- Bump ktsu.DeepClone from 1.1.16 to 1.2.0 in the ktsu group ([@dependabot[bot]](https://github.com/dependabot[bot]))
## v1.3.3-pre.4 (prerelease)

Changes since v1.3.3-pre.3:

- Bump Microsoft.DotNet.ILCompiler in the microsoft group ([@dependabot[bot]](https://github.com/dependabot[bot]))
## v1.3.3-pre.3 (prerelease)

Changes since v1.3.3-pre.2:

- Sync scripts\make-version.ps1 ([@ktsu[bot]](https://github.com/ktsu[bot]))
- Sync scripts\make-changelog.ps1 ([@ktsu[bot]](https://github.com/ktsu[bot]))
## v1.3.3-pre.2 (prerelease)

Changes since v1.3.3-pre.1:

- Sync .github\workflows\dotnet.yml ([@ktsu[bot]](https://github.com/ktsu[bot]))
## v1.3.3-pre.1 (prerelease)

Changes since v1.3.2:

- Add mailmap ([@matt-edmondson](https://github.com/matt-edmondson))
## v1.3.2 (patch)

Changes since v1.3.1:

- Add automation scripts for metadata management and versioning ([@matt-edmondson](https://github.com/matt-edmondson))
## v1.3.2-pre.27 (prerelease)

Changes since v1.3.2-pre.26:

- Sync .github\workflows\dotnet.yml ([@ktsu[bot]](https://github.com/ktsu[bot]))
## v1.3.2-pre.26 (prerelease)

Changes since v1.3.2-pre.25:

- Sync .github\workflows\dotnet.yml ([@ktsu[bot]](https://github.com/ktsu[bot]))
## v1.3.2-pre.25 (prerelease)

Changes since v1.3.2-pre.24:
## v1.3.2-pre.24 (prerelease)

Changes since v1.3.2-pre.23:
## v1.3.2-pre.23 (prerelease)

Changes since v1.3.2-pre.22:
## v1.3.2-pre.22 (prerelease)

Changes since v1.3.2-pre.21:

- Bump MSTest from 3.7.2 to 3.7.3 ([@dependabot[bot]](https://github.com/dependabot[bot]))
## v1.3.2-pre.21 (prerelease)

Changes since v1.3.2-pre.20:
## v1.3.2-pre.20 (prerelease)

Changes since v1.3.2-pre.19:
## v1.3.2-pre.19 (prerelease)

Changes since v1.3.2-pre.18:

- Bump MSTest from 3.7.1 to 3.7.2 ([@dependabot[bot]](https://github.com/dependabot[bot]))
## v1.3.2-pre.18 (prerelease)

Changes since v1.3.2-pre.17:

- Bump coverlet.collector from 6.0.3 to 6.0.4 ([@dependabot[bot]](https://github.com/dependabot[bot]))
## v1.3.2-pre.17 (prerelease)

Changes since v1.3.2-pre.16:
## v1.3.2-pre.16 (prerelease)

Changes since v1.3.2-pre.15:
## v1.3.2-pre.15 (prerelease)

Changes since v1.3.2-pre.14:

- Bump Microsoft.DotNet.ILCompiler in the microsoft group ([@dependabot[bot]](https://github.com/dependabot[bot]))
## v1.3.2-pre.14 (prerelease)

Changes since v1.3.2-pre.13:

- Bump MSTest from 3.7.0 to 3.7.1 ([@dependabot[bot]](https://github.com/dependabot[bot]))
## v1.3.2-pre.13 (prerelease)

Changes since v1.3.2-pre.12:
## v1.3.2-pre.12 (prerelease)

Changes since v1.3.2-pre.11:

- Sync .github\workflows\dotnet.yml ([@ktsu[bot]](https://github.com/ktsu[bot]))
## v1.3.2-pre.11 (prerelease)

Changes since v1.3.2-pre.10:

- Sync scripts\make-version.ps1 ([@ktsu[bot]](https://github.com/ktsu[bot]))
- Sync scripts\make-changelog.ps1 ([@ktsu[bot]](https://github.com/ktsu[bot]))
## v1.3.2-pre.10 (prerelease)

Changes since v1.3.2-pre.9:
## v1.3.2-pre.9 (prerelease)

Changes since v1.3.2-pre.8:

- Sync .github\workflows\dotnet.yml ([@ktsu[bot]](https://github.com/ktsu[bot]))
## v1.3.2-pre.8 (prerelease)

Changes since v1.3.2-pre.7:
## v1.3.2-pre.7 (prerelease)

Changes since v1.3.2-pre.6:

- Bump ktsu.DeepClone from 1.1.14 to 1.1.16 in the ktsu group ([@dependabot[bot]](https://github.com/dependabot[bot]))
## v1.3.2-pre.6 (prerelease)

Changes since v1.3.2-pre.5:

- Sync .mailmap ([@ktsu[bot]](https://github.com/ktsu[bot]))
- Sync scripts\make-version.ps1 ([@ktsu[bot]](https://github.com/ktsu[bot]))
## v1.3.2-pre.5 (prerelease)

Changes since v1.3.2-pre.4:

- Add mailmap ([@matt-edmondson](https://github.com/matt-edmondson))
## v1.3.2-pre.4 (prerelease)

Changes since v1.3.2-pre.3:

- Add automation scripts for metadata management and versioning ([@matt-edmondson](https://github.com/matt-edmondson))
## v1.3.2-pre.3 (prerelease)

Changes since v1.3.2-pre.2:

- Bump coverlet.collector from 6.0.2 to 6.0.3 ([@dependabot[bot]](https://github.com/dependabot[bot]))
## v1.3.2-pre.2 (prerelease)

Changes since v1.3.2-pre.1:

- Bump ktsu.StrongStrings from 1.2.25 to 1.2.26 in the ktsu group ([@dependabot[bot]](https://github.com/dependabot[bot]))
## v1.3.2-pre.1 (prerelease)

Incremental prerelease update.
## v1.3.1 (patch)

Changes since v1.3.0:

- Refactor LineEndingStyle enumeration to standalone ([@matt-edmondson](https://github.com/matt-edmondson))
## v1.3.0 (minor)

Changes since v1.2.0:

- Add line ending methods and tests, update README ([@matt-edmondson](https://github.com/matt-edmondson))
- Renamed metadata files ([@matt-edmondson](https://github.com/matt-edmondson))
- Refactor test method names and update LICENSE ([@matt-edmondson](https://github.com/matt-edmondson))
- Replace LICENSE file with LICENSE.md and update copyright information ([@matt-edmondson](https://github.com/matt-edmondson))
## v1.2.16-pre.3 (prerelease)

Changes since v1.2.16-pre.2:

- Sync .github\workflows\dotnet.yml ([@ktsu[bot]](https://github.com/ktsu[bot]))
## v1.2.16-pre.2 (prerelease)

Changes since v1.2.16-pre.1:

- Sync .github\workflows\dotnet.yml ([@ktsu[bot]](https://github.com/ktsu[bot]))
## v1.2.16-pre.1 (prerelease)

Changes since v1.2.15-pre.1:

- Sync .github\workflows\dotnet.yml ([@ktsu[bot]](https://github.com/ktsu[bot]))
## v1.2.15-pre.1 (prerelease)

Changes since v1.2.14:

- Renamed metadata files ([@matt-edmondson](https://github.com/matt-edmondson))
## v1.2.14 (patch)

Changes since v1.2.13:

- Sync icon.png ([@ktsu[bot]](https://github.com/ktsu[bot]))
## v1.2.13 (patch)

Changes since v1.2.12:

- Sync Directory.Build.props ([@ktsu[bot]](https://github.com/ktsu[bot]))
## v1.2.12 (patch)

Changes since v1.2.11:

- Sync Directory.Build.props ([@ktsu[bot]](https://github.com/ktsu[bot]))
## v1.2.11 (patch)

Changes since v1.2.10:

- Sync Directory.Build.props ([@ktsu[bot]](https://github.com/ktsu[bot]))
## v1.2.10 (patch)

Changes since v1.2.9:

- Replace LICENSE file with LICENSE.md and update copyright information ([@matt-edmondson](https://github.com/matt-edmondson))
## v1.2.10-pre.1 (prerelease)

Changes since v1.2.10:

- Renamed metadata files ([@matt-edmondson](https://github.com/matt-edmondson))
## v1.2.9 (patch)

Changes since v1.2.8:

- Sync Directory.Build.targets ([@ktsu[bot]](https://github.com/ktsu[bot]))
## v1.2.8 (patch)

Changes since v1.2.7:

- Refactor test method names and update LICENSE ([@matt-edmondson](https://github.com/matt-edmondson))
## v1.2.7 (patch)

Changes since v1.2.6:

- Bump the ktsu group with 2 updates ([@dependabot[bot]](https://github.com/dependabot[bot]))
## v1.2.6 (patch)

Changes since v1.2.5:

- Sync .github\workflows\dotnet.yml ([@ktsu[bot]](https://github.com/ktsu[bot]))
## v1.2.5 (patch)

Changes since v1.2.4:

- Sync .github\workflows\dotnet.yml ([@ktsu[bot]](https://github.com/ktsu[bot]))
## v1.2.4 (patch)

Changes since v1.2.3:
## v1.2.3 (patch)

Changes since v1.2.2:

- Sync Directory.Build.props ([@ktsu[bot]](https://github.com/ktsu[bot]))
- Sync Directory.Build.targets ([@ktsu[bot]](https://github.com/ktsu[bot]))
## v1.2.2 (patch)

Changes since v1.2.1:
## v1.2.1 (patch)

Changes since v1.2.0:

- Sync .github\workflows\dotnet.yml ([@ktsu[bot]](https://github.com/ktsu[bot]))
- Sync Directory.Build.props ([@ktsu[bot]](https://github.com/ktsu[bot]))
- Sync Directory.Build.targets ([@ktsu[bot]](https://github.com/ktsu[bot]))
- Sync .github\workflows\dotnet.yml ([@ktsu[bot]](https://github.com/ktsu[bot]))
- Sync Directory.Build.targets ([@ktsu[bot]](https://github.com/ktsu[bot]))
- Sync Directory.Build.targets ([@ktsu[bot]](https://github.com/ktsu[bot]))
- Bump MSTest.TestAdapter from 3.6.4 to 3.7.0 ([@dependabot[bot]](https://github.com/dependabot[bot]))
- Sync Directory.Build.props ([@ktsu[bot]](https://github.com/ktsu[bot]))
- Bump MSTest.TestFramework from 3.6.4 to 3.7.0 ([@dependabot[bot]](https://github.com/dependabot[bot]))
## v1.2.0 (minor)

Changes since v1.1.0:

- Add Join extension methods to EnumerableExtensions ([@matt-edmondson](https://github.com/matt-edmondson))
- Add comprehensive unit tests for Join method ([@matt-edmondson](https://github.com/matt-edmondson))
- Update README.md to document new Join extension method ([@matt-edmondson](https://github.com/matt-edmondson))
## v1.1.0 (minor)

Changes since v1.0.0:

- Add ShallowClone to enumerables and dictionaries ([@matt-edmondson](https://github.com/matt-edmondson))
- Add AddOrReplace method to DictionaryExtensions ([@matt-edmondson](https://github.com/matt-edmondson))
- Add string.As<StrongStrong>() ([@matt-edmondson](https://github.com/matt-edmondson))
- Add DeepClone for dictionaries ([@matt-edmondson](https://github.com/matt-edmondson))
- Add collection handling and conversion extensions ([@matt-edmondson](https://github.com/matt-edmondson))
- Update DESCRIPTION and overhaul README.md ([@matt-edmondson](https://github.com/matt-edmondson))
- Add support for GetOrCreate on concurrent dictionaries ([@matt-edmondson](https://github.com/matt-edmondson))
- Update package references and add ILCompiler dependency ([@matt-edmondson](https://github.com/matt-edmondson))
- Add a locket overload of ForEach ([@matt-edmondson](https://github.com/matt-edmondson))
- Add CollectionExtensions with AddMany method ([@matt-edmondson](https://github.com/matt-edmondson))
- Fix Dictionary return types ([@matt-edmondson](https://github.com/matt-edmondson))
- Migrate ktsu.io to ktsu namespace ([@matt-edmondson](https://github.com/matt-edmondson))
- Add new unit tests ([@matt-edmondson](https://github.com/matt-edmondson))
- Minor code style changes ([@matt-edmondson](https://github.com/matt-edmondson))
- Migrate ktsu.io to ktsu namespace ([@matt-edmondson](https://github.com/matt-edmondson))
- Add new tests and refactor extension methods ([@matt-edmondson](https://github.com/matt-edmondson))
- Add an overload to ToCollection that takes an object to acquire a lock on while enumerating ([@matt-edmondson](https://github.com/matt-edmondson))
- Add DeepClone enumerable extension ([@matt-edmondson](https://github.com/matt-edmondson))
## v1.0.37 (patch)

Changes since v1.0.36:

- Bump ktsu.DeepClone from 1.1.2 to 1.1.3 in the ktsu group ([@dependabot[bot]](https://github.com/dependabot[bot]))
## v1.0.36 (patch)

Changes since v1.0.35:

- Bump MSTest.TestFramework from 3.6.3 to 3.6.4 ([@dependabot[bot]](https://github.com/dependabot[bot]))
- Bump the ktsu group with 2 updates ([@dependabot[bot]](https://github.com/dependabot[bot]))
## v1.0.35 (patch)

Changes since v1.0.34:

- Bump MSTest.TestAdapter from 3.6.3 to 3.6.4 ([@dependabot[bot]](https://github.com/dependabot[bot]))
## v1.0.34 (patch)

Changes since v1.0.33:
## v1.0.33 (patch)

Changes since v1.0.32:
## v1.0.32 (patch)

Changes since v1.0.31:

- Sync Directory.Build.targets ([@ktsu[bot]](https://github.com/ktsu[bot]))
## v1.0.31 (patch)

Changes since v1.0.30:

- Update package references and add ILCompiler dependency ([@matt-edmondson](https://github.com/matt-edmondson))
## v1.0.30 (patch)

Changes since v1.0.29:

- Add new tests and refactor extension methods ([@matt-edmondson](https://github.com/matt-edmondson))
## v1.0.29 (patch)

Changes since v1.0.28:

- Add collection handling and conversion extensions ([@matt-edmondson](https://github.com/matt-edmondson))
## v1.0.28 (patch)

Changes since v1.0.27:

- Sync Directory.Build.props ([@ktsu[bot]](https://github.com/ktsu[bot]))
## v1.0.27 (patch)

Changes since v1.0.26:

- Bump ktsu.DeepClone from 1.0.15 to 1.0.16 in the ktsu group ([@dependabot[bot]](https://github.com/dependabot[bot]))
## v1.0.26 (patch)

Changes since v1.0.25:

- Sync Directory.Build.props ([@ktsu[bot]](https://github.com/ktsu[bot]))
- Sync Directory.Build.targets ([@ktsu[bot]](https://github.com/ktsu[bot]))
- Bump the ktsu group with 2 updates ([@dependabot[bot]](https://github.com/dependabot[bot]))
- Bump Microsoft.NET.Test.Sdk in the microsoft group ([@dependabot[bot]](https://github.com/dependabot[bot]))
## v1.0.25 (patch)

Changes since v1.0.24:

- Bump the ktsu group with 2 updates ([@dependabot[bot]](https://github.com/dependabot[bot]))
## v1.0.24 (patch)

Changes since v1.0.23:

- Bump MSTest.TestFramework from 3.6.2 to 3.6.3 ([@dependabot[bot]](https://github.com/dependabot[bot]))
- Bump MSTest.TestAdapter from 3.6.2 to 3.6.3 ([@dependabot[bot]](https://github.com/dependabot[bot]))
## v1.0.23 (patch)

Changes since v1.0.22:

- Bump the ktsu group with 2 updates ([@dependabot[bot]](https://github.com/dependabot[bot]))
## v1.0.22 (patch)

Changes since v1.0.21:

- Bump MSTest.TestAdapter from 3.6.1 to 3.6.2 ([@dependabot[bot]](https://github.com/dependabot[bot]))
- Bump MSTest.TestFramework from 3.6.1 to 3.6.2 ([@dependabot[bot]](https://github.com/dependabot[bot]))
## v1.0.21 (patch)

Changes since v1.0.20:

- Bump ktsu.DeepClone from 1.0.11 to 1.0.12 in the ktsu group ([@dependabot[bot]](https://github.com/dependabot[bot]))
## v1.0.20 (patch)

Changes since v1.0.19:

- Bump MSTest.TestFramework from 3.6.0 to 3.6.1 ([@dependabot[bot]](https://github.com/dependabot[bot]))
- Bump the ktsu group with 2 updates ([@dependabot[bot]](https://github.com/dependabot[bot]))
## v1.0.19 (patch)

Changes since v1.0.18:

- Bump MSTest.TestAdapter from 3.6.0 to 3.6.1 ([@dependabot[bot]](https://github.com/dependabot[bot]))
## v1.0.18 (patch)

Changes since v1.0.17:

- Bump the ktsu group with 2 updates ([@dependabot[bot]](https://github.com/dependabot[bot]))
## v1.0.17 (patch)

Changes since v1.0.16:

- Sync .github\workflows\dotnet.yml ([@ktsu[bot]](https://github.com/ktsu[bot]))
## v1.0.16 (patch)

Changes since v1.0.15:

- Bump the ktsu group with 2 updates ([@dependabot[bot]](https://github.com/dependabot[bot]))
## v1.0.15 (patch)

Changes since v1.0.14:
## v1.0.14 (patch)

Changes since v1.0.13:

- Add string.As<StrongStrong>() ([@matt-edmondson](https://github.com/matt-edmondson))
## v1.0.13 (patch)

Changes since v1.0.12:

- Sync .github\workflows\dependabot-merge.yml ([@ktsu[bot]](https://github.com/ktsu[bot]))
## v1.0.12 (patch)

Changes since v1.0.11:

- Sync .github\workflows\dependabot-merge.yml ([@ktsu[bot]](https://github.com/ktsu[bot]))
## v1.0.11 (patch)

Changes since v1.0.10:

- Sync .github\workflows\dependabot-merge.yml ([@ktsu[bot]](https://github.com/ktsu[bot]))
## v1.0.10 (patch)

Changes since v1.0.9:

- Sync .github\workflows\dependabot-merge.yml ([@ktsu[bot]](https://github.com/ktsu[bot]))
- Sync .github\workflows\dotnet.yml ([@ktsu[bot]](https://github.com/ktsu[bot]))
- Sync .github\workflows\dotnet.yml ([@ktsu[bot]](https://github.com/ktsu[bot]))
- Sync .github\workflows\dotnet.yml ([@ktsu[bot]](https://github.com/ktsu[bot]))
- Sync .github\workflows\dotnet.yml ([@ktsu[bot]](https://github.com/ktsu[bot]))
- Sync .github\workflows\dependabot-merge.yml ([@ktsu[bot]](https://github.com/ktsu[bot]))
- Sync .github\workflows\dotnet.yml ([@ktsu[bot]](https://github.com/ktsu[bot]))
- Bump MSTest.TestFramework from 3.5.2 to 3.6.0 ([@dependabot[bot]](https://github.com/dependabot[bot]))
- Bump ktsu.StrongStrings from 1.2.0 to 1.2.1 ([@dependabot[bot]](https://github.com/dependabot[bot]))
- Bump MSTest.TestAdapter from 3.5.2 to 3.6.0 ([@dependabot[bot]](https://github.com/dependabot[bot]))
- Sync .github\dependabot.yml ([@ktsu[bot]](https://github.com/ktsu[bot]))
- Bump ktsu.DeepClone from 1.0.2 to 1.0.3 ([@dependabot[bot]](https://github.com/dependabot[bot]))
## v1.0.9 (patch)

Changes since v1.0.8:

- Bump ktsu.StrongStrings from 1.1.1 to 1.2.0 ([@dependabot[bot]](https://github.com/dependabot[bot]))
## v1.0.8 (patch)

Changes since 1.0.7:

- Migrate ktsu.io to ktsu namespace ([@matt-edmondson](https://github.com/matt-edmondson))
- Migrate ktsu.io to ktsu namespace ([@matt-edmondson](https://github.com/matt-edmondson))
## v1.0.0 (major)

- Add IEnumerable.ToCollection ([@matt-edmondson](https://github.com/matt-edmondson))
- Update dotnet.yml ([@matt-edmondson](https://github.com/matt-edmondson))
- Add DictionaryExtensions.GetOrCreate() ([@matt-edmondson](https://github.com/matt-edmondson))
- Update dotnet.yml ([@matt-edmondson](https://github.com/matt-edmondson))
- Update nuget.config ([@matt-edmondson](https://github.com/matt-edmondson))
- Avoid double upload of symbols package ([@matt-edmondson](https://github.com/matt-edmondson))
- Read from VERSION when building ([@matt-edmondson](https://github.com/matt-edmondson))
- Update build config ([@matt-edmondson](https://github.com/matt-edmondson))
- Update nuget.config ([@matt-edmondson](https://github.com/matt-edmondson))
- Assign dependabot PRs to matt ([@matt-edmondson](https://github.com/matt-edmondson))
- Dont try to push packages when building pull requests ([@matt-edmondson](https://github.com/matt-edmondson))
- Initial commit ([@matt-edmondson](https://github.com/matt-edmondson))
- Update descriptions and readme ([@matt-edmondson](https://github.com/matt-edmondson))
- Update .project.props ([@matt-edmondson](https://github.com/matt-edmondson))
- Update dotnet.yml ([@matt-edmondson](https://github.com/matt-edmondson))
- Update dotnet.yml ([@matt-edmondson](https://github.com/matt-edmondson))
- Update LICENSE ([@matt-edmondson](https://github.com/matt-edmondson))
- Create dependabot-merge.yml ([@matt-edmondson](https://github.com/matt-edmondson))
- Add ReplaceOrdinal for strings ([@matt-edmondson](https://github.com/matt-edmondson))
- Add String extensions for StrongStrings ([@matt-edmondson](https://github.com/matt-edmondson))
- Update build scripts ([@matt-edmondson](https://github.com/matt-edmondson))
- Added RemoveSuffix and RemovePrefix ([@matt-edmondson](https://github.com/matt-edmondson))
- Add EnumerableExtensions hoisted from ImGuiApp ([@matt-edmondson](https://github.com/matt-edmondson))
- Read from AUTHORS file during build ([@matt-edmondson](https://github.com/matt-edmondson))
- Update Directory.Build.targets ([@matt-edmondson](https://github.com/matt-edmondson))
- Read PackageDescription from DESCRIPTION file ([@matt-edmondson](https://github.com/matt-edmondson))
- Migrate from .project.props to Directory.Build.props ([@matt-edmondson](https://github.com/matt-edmondson))
- Enable dependabot and sourcelink ([@matt-edmondson](https://github.com/matt-edmondson))
- Update Directory.Build.props ([@matt-edmondson](https://github.com/matt-edmondson))
- Add ForEach to enumerable extensions ([@matt-edmondson](https://github.com/matt-edmondson))
- Update Directory.Build.props ([@matt-edmondson](https://github.com/matt-edmondson))
- v1.0.0-alpha.8 ([@matt-edmondson](https://github.com/matt-edmondson))
- Add github package support ([@matt-edmondson](https://github.com/matt-edmondson))
- Update LICENSE ([@matt-edmondson](https://github.com/matt-edmondson))
- Create VERSION ([@matt-edmondson](https://github.com/matt-edmondson))
- Make Dictionary.GetOrCreate not return a nullable ([@matt-edmondson](https://github.com/matt-edmondson))
- Update readme ([@matt-edmondson](https://github.com/matt-edmondson))
- Add an overload of GetOrCreate for dictionaries that takes a supplied default value ([@matt-edmondson](https://github.com/matt-edmondson))