All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.sonar.plugins.csharp.S6607.html Maven / Gradle / Ivy

There is a newer version: 10.2.0.105762
Show newest version

Why is this an issue?

When working with LINQ in C#, it is recommended to pay attention to the order in which methods are chained, especially when using Where and OrderBy methods. It is advised to call the Where method before OrderBy because Where filters the elements of the sequence based on a given condition and returns a new sequence containing only the elements that satisfy that condition. Calling OrderBy before Where, may end up sorting elements that will be later discarded, which can lead to inefficiency. Conversely, calling Where before OrderBy, will first filter the sequence to include only the elements of interest, and then sort them based on the specified order.

What is the potential impact?

We measured at least 2x improvement in execution time. For more details see the Benchmarks section from the More info tab.

How to fix it

The issue can be fixed by calling Where before OrderBy.

Code examples

Noncompliant code example

public IEnumerable<int> GetSortedFilteredList(IEnumerable<int> data) =>
    data.OrderBy(x => x).Where(x => x % 2 == 0);

Compliant solution

public IEnumerable<int> GetSortedFilteredList(IEnumerable<int> data) =>
     data.Where(x => x % 2 == 0).OrderBy(x => x);

Resources

Documentation

Articles & blog posts

Benchmarks

Method Runtime Mean Standard Deviation

OrderByThenWhere

.NET 7.0

175.36 ms

5.101 ms

WhereThenOrderBy

.NET 7.0

85.58 ms

1.697 ms

Glossary

The results were generated by running the following snippet with BenchmarkDotNet:

private IList<int> data;
private static readonly Random Random = new Random();

[Params(1_000_000)]
public int NumberOfEntries;

[GlobalSetup]
public void Setup() =>
    data = Enumerable.Range(0, NumberOfEntries).Select(x => Random.Next(0, NumberOfEntries)).ToList();

[Benchmark(Baseline = true)]
public void OrderByThenWhere() =>
    _ = data.OrderBy(x => x).Where(x => x % 2 == 0 ).ToList();  // OrderBy followed by Where

[Benchmark]
public void WhereThenOrderBy() =>
    _ = data.Where(x => x % 2 == 0 ).OrderBy(x => x).ToList();  // Where followed by OrderBy

Hardware configuration:

BenchmarkDotNet=v0.13.5, OS=Windows 10 (10.0.19045.2846/22H2/2022Update)
12th Gen Intel Core i7-12800H, 1 CPU, 20 logical and 14 physical cores
.NET SDK=7.0.203
  [Host]               : .NET 7.0.5 (7.0.523.17405), X64 RyuJIT AVX2
  .NET 7.0             : .NET 7.0.5 (7.0.523.17405), X64 RyuJIT AVX2




© 2015 - 2024 Weber Informatics LLC | Privacy Policy