EnumerablePrinter 2.1.0

dotnet add package EnumerablePrinter --version 2.1.0
                    
NuGet\Install-Package EnumerablePrinter -Version 2.1.0
                    
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="EnumerablePrinter" Version="2.1.0" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="EnumerablePrinter" Version="2.1.0" />
                    
Directory.Packages.props
<PackageReference Include="EnumerablePrinter" />
                    
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 EnumerablePrinter --version 2.1.0
                    
#r "nuget: EnumerablePrinter, 2.1.0"
                    
#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.
#:package EnumerablePrinter@2.1.0
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=EnumerablePrinter&version=2.1.0
                    
Install as a Cake Addin
#tool nuget:?package=EnumerablePrinter&version=2.1.0
                    
Install as a Cake Tool

EnumerablePrinter

A lightweight, reflection-aware formatter for debugging .NET objects, collections, and dictionaries.

EnumerablePrinter is intentionally focused on one job: printing data in a clear, predictable, human-readable format for console output, logging, and quick inspection during development. It does not try to duplicate features already provided by the .NET framework.


Why this project exists

The library was deliberately narrowed to a single purpose:

  • print common .NET values clearly
  • render nested structures recursively
  • show object properties in a debug-friendly way
  • keep output readable and consistent
  • avoid re-implementing framework features that already exist elsewhere

This makes the library easier to understand, easier to maintain, and better aligned with real debugging workflows.


Features

  • pretty-prints arrays, lists, sets, and other IEnumerable values
  • prints IDictionary entries as key/value output
  • reflects public instance properties for complex objects
  • handles string, byte[], and IEnumerable<char> gracefully
  • prevents circular-reference recursion from causing runaway output
  • supports console output or any TextWriter
  • keeps the public API intentionally small and focused
  • includes optional Python-style slicing through the separate EnumerablePrinter.Linq project
  • includes a separate Roslyn analyzer project for flagging Print() calls in performance-sensitive code

Optional sequence slicing

The EnumerablePrinter.Linq project adds a focused Slice() extension for IEnumerable<T> values. It supports optional start, end, and positive step parameters, including negative indices.

Reference the project alongside EnumerablePrinter:

<ProjectReference Include="..\..\src\EnumerablePrinter.Linq\EnumerablePrinter.Linq.csproj" />

Then use it with the printer:

using EnumerablePrinter.Extensions;
using EnumerablePrinter.Linq;

var numbers = new[] { 10, 20, 30, 40, 50, 60 };

numbers.Slice(start: 1, end: 4).Print();
// [20, 30, 40]

numbers.Slice(step: 2).Print();
// [10, 30, 50]

var fruits = new[] { "Apple", "Banana", "Cherry", "Date", "Elderberry" };
fruits.Slice(start: -3).Print();
// ["Cherry", "Date", "Elderberry"]

Positive-index slices stream from the source; slices using negative indices buffer the source so they can resolve positions from the end. step must be greater than zero.


Installation

dotnet add package EnumerablePrinter

Roslyn analyzer

The repository also contains EnumerablePrinter.Analyzers, a separate netstandard2.0 Roslyn analyzer project. It defines diagnostic EP0001, which reports calls to EnumerablePrinter.Extensions.PrintExtensions.Print and suggests explicit formatting or logging instead.

The analyzer is maintained separately from the core EnumerablePrinter package. To use it from a local checkout, add a project reference to src/EnumerablePrinter.Analyzers/EnumerablePrinter.Analyzers.csproj in the consuming project.


Basic usage

using EnumerablePrinter.Extensions;

var numbers = new[] { 1, 2, 3, 4, 5 };
numbers.Print();
// [1, 2, 3, 4, 5]

var person = new { Name = "Wayne", Age = 42 };
person.Print();
// {Name: "Wayne", Age: 42}

var metadata = new Dictionary<string, int>
{
    ["One"] = 1,
    ["Two"] = 2
};
metadata.Print();
// {"One": 1, "Two": 2}

Explicit console output

new[] { 1, 2, 3 }.PrintToConsole();

This follows the same formatting path as Print(), but makes the console intent explicit.


Output conventions

The formatter uses a consistent debug-printing style:

  • collections render as [ ... ]
  • dictionaries render as { "key": value }
  • object properties render as PropertyName: value
  • strings are quoted
  • null renders as null
  • circular references render as <Circular Reference>

Repository workflow

The project is organized around a clean release and publish split:

  • release scripts handle versioning and git tagging
  • deploy scripts handle build, test, packaging, and NuGet publishing

See the script guide in scripts/README.md for the full flow and dry-run usage.


Final project direction

The current design intentionally avoids adding collection helpers or framework duplicates. The library remains focused on the single, practical task it does well: iterating over values and printing them in a clear, debug-friendly form.


License

MIT


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 was computed.  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.
  • net8.0

    • No dependencies.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
2.1.0 43 9/18/2026
2.0.9 38 9/18/2026
2.0.7 40 9/18/2026
1.1.3 57 9/14/2026
1.1.2 55 9/14/2026
1.1.1 192 1/11/2026
1.1.0 137 1/11/2026
1.0.6 210 10/13/2025
1.0.5 204 10/10/2025
1.0.3 206 10/2/2025
1.0.2 185 9/6/2025
1.0.1 211 7/10/2025