Using CountBy and AggregateBy in C# 13 / .NET 9

It’s great to see Microsoft still giving us new things in LINQ. With C# 13 / .NET 9, we get CountBy and AggregateBy, so let’s see how to use them.

  Dec 3, 2024 (rev. Sep 16, 2025) ·  5 min

Async, CancellationToken, and IProgress in 5 Short Examples

Async code isn’t always intuitive, but practicing helps. Let’s take a look at Async, CancellationToken, and IProgress, in a few short examples.

  Oct 7, 2024 (rev. Sep 16, 2025) ·  8 min

Using TimeProvider and FakeTimeProvider in WinForms

Testing .NET code involving time has always been a pain, but the TimeProvider class (backported to the .NET Framework) gives us awesome new tools.

  Feb 5, 2024 (rev. Sep 16, 2025) ·  7 min

SSRS won't show the updated default value for a parameter

Changed the default value for a report parameter, but it’s not actually updating in SSRS? That’s by design. Let’s find a way around it.

  Jan 31, 2024 (rev. Sep 16, 2025) ·  6 min

How to use (and test) TimeProvider timers in .NET

Testing timers in C# is difficult, but .NET 8 (C# 12) adds an abstract TimeProvider class that makes it easier. Let’s take a closer look.

  Jan 11, 2024 (rev. Sep 16, 2025) ·  10 min

How to use TimeProvider and FakeTimeProvider (time abstraction in .NET)

Testing time in C# is difficult, but .NET 8 (C# 12) adds an abstract TimeProvider class that makes it easier. Let’s take a closer look.

  Jan 7, 2024 (rev. Sep 16, 2025) ·  12 min

If/else vs switch/case pattern matching

A look at if/else, switch/case, pattern matching, other options … and which is best. (spoiler: none ;) )

  Nov 3, 2023 (rev. Sep 16, 2025) ·  9 min

What are list patterns in C#?

C# has been getting a lot of pattern matching love in recent years, like with list patterns in C# 11. The problem is knowing where and how to use it.

  Aug 31, 2023 (rev. Sep 16, 2025) ·  8 min

What are generic attributes in C# 11?

Generic attributes increase the flexibility of a very early .NET feature. Let’s try using them and see how it keeps our code DRY.

  Aug 23, 2023 (rev. Sep 16, 2025) ·  6 min

How to call an async method from a synchronous one, without deadlocking

Writing async code whenever possible is great, but how do we do it when we’re stuck with legacy (and very synchronous) code?

  Aug 11, 2023 (rev. Sep 16, 2025) ·  7 min