GV

GeezerVison

The World Wide Web, restored to 800 pixels of glory.

Home|About|Gaming cabinet|Archives|How it works|Starter sites

On this site

  • Sign in
  • ActionsCI/CD and automation
  • CodespacesCloud development environments
  • All Features
  • Documentation
  • Training
  • Certifications
  • Build with Copilot
  • Customize Copilot
  • Integrations
  • Trending repos
  • GitHub Sponsors
  • Developer articles
  • Enterprises

This view

  • Original page
  • New address

GeezerVison is showing github.com — GitHub - ktsu-dev/Sorting: A natural string comparison library that correctly sorts alphanumeric strings by comparing embedded numbers as numeric values.

BranchesTags
Open more actions menu

Latest commit

 

History

396 Commits
396 Commits

Folders and files

NameName
Last commit message
Last commit date
.github
.github
 
 
Sorting.Test
Sorting.Test
 
 
Sorting
Sorting
 
 
.editorconfig
.editorconfig
 
 
.gitattributes
.gitattributes
 
 
.gitignore
.gitignore
 
 
.mailmap
.mailmap
 
 
.runsettings
.runsettings
 
 
AUTHORS.md
AUTHORS.md
 
 
AUTHORS.url
AUTHORS.url
 
 
CHANGELOG.md
CHANGELOG.md
 
 
CLAUDE.md
CLAUDE.md
 
 
COPYRIGHT.md
COPYRIGHT.md
 
 
DESCRIPTION.md
DESCRIPTION.md
 
 
Directory.Packages.props
Directory.Packages.props
 
 
LATEST_CHANGELOG.md
LATEST_CHANGELOG.md
 
 
LICENSE.md
LICENSE.md
 
 
PROJECT_URL.url
PROJECT_URL.url
 
 
README.md
README.md
 
 
Sorting.sln
Sorting.sln
 
 
TAGS.md
TAGS.md
 
 
VERSION.md
VERSION.md
 
 
global.json
global.json
 
 
icon.png
icon.png
 
 

Repository files navigation

ktsu.Sorting

A .NET library that provides advanced sorting utilities for specialized sorting scenarios.

License NuGet Version NuGet Version NuGet Downloads GitHub commit activity GitHub contributors GitHub Actions Workflow Status

Overview

ktsu.Sorting offers a collection of sorting utilities to address common sorting challenges that aren't easily handled by standard sorting methods. The library is designed to be modular and extensible, allowing you to use only the components you need.

Components

NaturalStringComparer

The first component in the ktsu.Sorting library is the NaturalStringComparer, which provides natural string comparison by treating embedded numeric parts as numbers rather than characters.

Problem

Standard string sorting sorts strings character by character, which results in unintuitive ordering for strings containing numbers:

"file1.txt"
"file10.txt"
"file2.txt"

Solution

NaturalStringComparer sorts strings the way a human would expect, recognizing and comparing embedded numbers as numeric values:

"file1.txt"
"file2.txt"
"file10.txt"

Installation

Package Manager

Install-Package ktsu.Sorting

.NET CLI

dotnet add package ktsu.Sorting

Usage

Using NaturalStringComparer

using ktsu.Sorting;

// Create a comparer instance
var comparer = new NaturalStringComparer();

// Compare individual strings
int result = comparer.Compare("file10.txt", "file2.txt"); // Returns > 0 (10 > 2)

// Sort an array using the natural comparer
string[] files = { "file10.txt", "file1.txt", "file100.txt", "file2.txt" };
Array.Sort(files, comparer);
// Result: "file1.txt", "file2.txt", "file10.txt", "file100.txt"

// Use with LINQ
var sortedFiles = files.OrderBy(file => file, new NaturalStringComparer());

Ignoring case

By default text is compared ordinally, so every uppercase letter sorts before every lowercase one. Use NaturalStringComparer.OrdinalIgnoreCase (or new NaturalStringComparer(ignoreCase: true)) to list names the way Windows Explorer and Finder do:

string[] files = { "file10.txt", "File2.txt", "file1.txt", "README.md", "build3.log", "Build20.log" };

Array.Sort(files, NaturalStringComparer.Ordinal);
// "Build20.log", "File2.txt", "README.md", "build3.log", "file1.txt", "file10.txt"

Array.Sort(files, NaturalStringComparer.OrdinalIgnoreCase);
// "build3.log", "Build20.log", "file1.txt", "File2.txt", "file10.txt", "README.md"

Strings that differ only in case are still never equal under OrdinalIgnoreCase. They are ordered next to each other, ordinally, so a SortedSet<string> keeps both file1 and File1.

Letters outside the Basic Multilingual Plane fold too, by code point, so names in Adlam, Deseret or Osage interleave the same way Latin names do. Folded text is still ordered by UTF-16 code unit, as Ordinal orders it, so U+E000 to U+FFFF sort after those letters, where string.Compare(..., StringComparison.OrdinalIgnoreCase) puts them before.

Case variants stay together even when a list also holds a variant that differs only in leading zeros or digit script. The two groupings can't both hold at once, so case wins: each spelling's case variants are adjacent, and the spellings sit side by side:

string[] files = { "photo1.jpg", "photo01.jpg", "Photo1.jpg" };

Array.Sort(files, NaturalStringComparer.OrdinalIgnoreCase);
// "photo01.jpg", "Photo1.jpg", "photo1.jpg"

Features

NaturalStringComparer

  • Correctly sorts strings containing numbers in a human-friendly order
  • Handles mixed alphanumeric strings
  • Properly compares strings with leading zeros
  • Fully compatible with .NET's IComparer<string> interface
  • Also implements the non-generic System.Collections.IComparer, for APIs that accept only that: ArrayList.Sort, WPF's ListCollectionView.CustomSort, WinForms' ListView.ListViewItemSorter. Arguments that aren't strings throw ArgumentException
  • Can be used with Array.Sort(), LINQ's OrderBy(), and other sorting mechanisms

Examples

NaturalStringComparer Examples

The NaturalStringComparer correctly sorts strings like:

Input Standard Sort Natural Sort
file1.txt file1.txt file1.txt
file10.txt file10.txt file2.txt
file2.txt file2.txt file10.txt
------------------------------- -------------------------------
z1.doc z1.doc z1.doc
z10.doc z10.doc z2.doc
z17.doc z17.doc z3.doc
z2.doc z2.doc z10.doc
z23.doc z23.doc z17.doc
z3.doc z3.doc z23.doc

License

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

About

A natural string comparison library that correctly sorts alphanumeric strings by comparing embedded numbers as numeric values.

ktsu.dev

Topics

algorithmalphanumericcomparercsharpdotnetfile-namesicomparernatural-ordernatural-sortnumeric-sortsortingstring-comparisonversion-strings

Resources

Readme
MIT license
Activity
Custom properties

Stars

0 stars

Watchers

1 watching

Forks

0 forks
Report repository

Releases

Packages

Used by

Contributors

Languages

You are visitor 01402503 — GeezerVison does not store the pages you look up.
Best viewed with Netscape Navigator 4.7 or Internet Explorer 6 at 800×600. No cookies required.