RangeForeach.Sources 0.8.1

There is a newer version of this package available.
See the version list below for details.
dotnet add package RangeForeach.Sources --version 0.8.1
NuGet\Install-Package RangeForeach.Sources -Version 0.8.1
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="RangeForeach.Sources" Version="0.8.1">
  <PrivateAssets>all</PrivateAssets>
  <IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets>
</PackageReference>
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add RangeForeach.Sources --version 0.8.1
#r "nuget: RangeForeach.Sources, 0.8.1"
#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.
// Install RangeForeach.Sources as a Cake Addin
#addin nuget:?package=RangeForeach.Sources&version=0.8.1

// Install RangeForeach.Sources as a Cake Tool
#tool nuget:?package=RangeForeach.Sources&version=0.8.1

C# Range-Foreach Syntax Extensions

Provides the range-foreach syntax for C# 9.0 or higher.

Supported frameworks:

  • .NET Framework >= 4.5
  • .NET Core >= 1.0
  • .NET Standard >= 1.0

NOTE: This is a source-only package and will not introduce any explicit dependencies to your project. Make sure that the PackageReference has the PrivateAssets node or attribute like this:


<PackageReference Include="RangeForeach.Sources" Version="0.8.1">
  <PrivateAssets>all</PrivateAssets>
  <IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets>
</PackageReference>


<PackageReference Include="RangeForeach.Sources" Version="0.8.1" PrivateAssets="all" />

Range-Foreach Syntax

Reference this package to write foreach-loops like this:

foreach (var index in 0..100)
{
    // loop body...
}

which is equivalent to the legacy for-loop below:

for (int index = 0; index < 100; index++)
{
    // loop body...
}

NOTE: Use ^ to represent negative numbers, e.g. ^100..0 (instead of -100..0).

Stepped Syntax

Use the Step method to write foreach-loops like this:

foreach (var index in (99..^1).Step(-2))
{
    // loop body...
}

which is equivalent to the legacy for-loop below:

for (int index = 99; index >= 0; index -= 2)
{
    // loop body...
}

Dependency Type Polyfill

This syntax requires the System.Range type (and also the System.Index type). Considering that early frameworks do not provide this type, this package includes the polyfill source.

If a third party package that includes the System.Range type (such as IndexRange, etc.) is referenced, define the INDEX_RANGE constant in the project file to avoid duplicate definitions:

<DefineConstants>$(DefineConstants);INDEX_RANGE</DefineConstants>

Performance Benchmark

BenchmarkDotNet=v0.13.1, OS=Windows 10.0.22621
AMD Ryzen 7 5800H with Radeon Graphics, 1 CPU, 16 logical and 8 physical cores
.NET SDK=7.0.101
  [Host]     : .NET 6.0.12 (6.0.1222.56807), X64 RyuJIT
  DefaultJob : .NET 6.0.12 (6.0.1222.56807), X64 RyuJIT
Method LoopCount Mean StdDev Ratio RatioSD
LegacyForLoop 1 0.1038 ns 0.0880 ns ? ?
RangeForeachLoop 1 0.2240 ns 0.0930 ns ? ?
SteppedRangeForeachLoop 1 7.1447 ns 0.1860 ns ? ?
EnumerableRangeForeachLoop 1 17.9865 ns 0.7955 ns ? ?
LegacyForLoop 3 0.7047 ns 0.1365 ns 1.00 0.00
RangeForeachLoop 3 0.9819 ns 0.1322 ns 1.45 0.35
SteppedRangeForeachLoop 3 7.7502 ns 0.1300 ns 12.16 1.89
EnumerableRangeForeachLoop 3 26.5011 ns 0.4834 ns 41.49 5.99
LegacyForLoop 10 2.6473 ns 0.1568 ns 1.00 0.00
RangeForeachLoop 10 3.2285 ns 0.1636 ns 1.22 0.09
SteppedRangeForeachLoop 10 9.7268 ns 0.3551 ns 3.66 0.27
EnumerableRangeForeachLoop 10 53.3254 ns 2.4620 ns 20.16 1.38
LegacyForLoop 100 29.1309 ns 0.8345 ns 1.00 0.00
RangeForeachLoop 100 31.0612 ns 0.6702 ns 1.07 0.04
SteppedRangeForeachLoop 100 33.9128 ns 0.5381 ns 1.17 0.04
EnumerableRangeForeachLoop 100 350.0842 ns 6.8264 ns 12.07 0.40
LegacyForLoop 1000 262.0913 ns 7.5677 ns 1.00 0.00
RangeForeachLoop 1000 265.2877 ns 5.8342 ns 1.01 0.03
SteppedRangeForeachLoop 1000 275.1638 ns 6.9428 ns 1.05 0.04
EnumerableRangeForeachLoop 1000 3,577.8530 ns 31.8177 ns 13.76 0.38
Product Compatible and additional computed target framework versions.
.NET net5.0 was computed.  net5.0-windows was computed.  net6.0 was computed.  net6.0-android was computed.  net6.0-ios was computed.  net6.0-maccatalyst was computed.  net6.0-macos was computed.  net6.0-tvos was computed.  net6.0-windows was computed.  net7.0 was computed.  net7.0-android was computed.  net7.0-ios was computed.  net7.0-maccatalyst was computed.  net7.0-macos was computed.  net7.0-tvos was computed.  net7.0-windows was computed.  net8.0 was computed.  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. 
.NET Core netcoreapp1.0 was computed.  netcoreapp1.1 was computed.  netcoreapp2.0 was computed.  netcoreapp2.1 was computed.  netcoreapp2.2 was computed.  netcoreapp3.0 was computed.  netcoreapp3.1 was computed. 
.NET Standard netstandard1.0 is compatible.  netstandard1.1 was computed.  netstandard1.2 was computed.  netstandard1.3 was computed.  netstandard1.4 was computed.  netstandard1.5 was computed.  netstandard1.6 was computed.  netstandard2.0 was computed.  netstandard2.1 was computed. 
.NET Framework net45 was computed.  net451 was computed.  net452 was computed.  net46 was computed.  net461 was computed.  net462 was computed.  net463 was computed.  net47 was computed.  net471 was computed.  net472 was computed.  net48 was computed.  net481 was computed. 
MonoAndroid monoandroid was computed. 
MonoMac monomac was computed. 
MonoTouch monotouch was computed. 
Tizen tizen30 was computed.  tizen40 was computed.  tizen60 was computed. 
Universal Windows Platform uap was computed.  uap10.0 was computed. 
Windows Phone wp8 was computed.  wp81 was computed.  wpa81 was computed. 
Windows Store netcore was computed.  netcore45 was computed.  netcore451 was computed. 
Xamarin.iOS xamarinios was computed. 
Xamarin.Mac xamarinmac was computed. 
Xamarin.TVOS xamarintvos was computed. 
Xamarin.WatchOS xamarinwatchos was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

This package has 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
1.2.8 165 2/8/2024
1.2.5 193 1/12/2024
1.2.0 207 12/6/2023
1.1.0 255 4/4/2023
1.0.1 226 3/12/2023
1.0.0 232 3/12/2023
0.9.0 272 3/8/2023
0.8.5 223 3/7/2023
0.8.1 294 3/5/2023
0.8.0 271 3/5/2023
0.7.0 286 1/19/2023
0.6.0 279 12/31/2022
0.5.0 413 9/27/2022
0.4.0 435 7/20/2022
0.2.0 444 7/19/2022
0.1.1 516 7/5/2022
0.1.0 404 7/3/2022