Skip to content

Instantly share code, notes, and snippets.

@mariusGundersen
mariusGundersen / Example11.cs
Created October 21, 2018 13:04
Duct-typed extension methods Example 11
// Example 11: add with params
// Use params to take several ints, each representing 3 digits
public static void Add<TKey>(this IDictionary<TKey, int> dictionary, TKey key, params int[] values)
=> dictionary.Add(key, values.Aggregate(0, (s, v) => s*1000 + v));
// Now we can write it like this
var populations = new Dictionary<string, int>
{
{ "China", 1,409,517,397 },
@mariusGundersen
mariusGundersen / Example10.cs
Created October 21, 2018 12:55
Duct-typed extension methods Example 10
// Example 10: add a tuple
// This is just a dummy class that we can use in the example
public class City
{
public City(string name, int population, string country)
{
Name = name;
Population = population;
Country = country;
@mariusGundersen
mariusGundersen / Example9.cs
Created October 21, 2018 12:49
Duct-typed extension methods Example 9
// Example 9: multi or single dimensional arrays?
// We define this extension method
public static void Add<T>(this List<T> list, params T[] items)
=> list.AddRange(items);
// And then we can make a flattened matrix
var matrix = new List<double>
{
{ 1, 0, 0 },
@mariusGundersen
mariusGundersen / Example8.cs
Last active October 21, 2018 12:53
Duct-typed extension methods Example 8
// Example 8: add a new instance
// This is just a dummy class that we can use in the example
public class City
{
public City(string name, int population, string country)
{
Name = name;
Population = population;
Country = country;
@mariusGundersen
mariusGundersen / Example7.cs
Last active October 21, 2018 12:53
Duct-typed extension methods Example 7
// Example 7: add a dictionary
// These are just some dummy methods for the example to work
public static IDictionary<string, int> GetAfricanCountries() => new Dictionary<string, int>{
{ "Nigeria", 190_886_311 },
{ "Ethiopia", 104_957_438 },
{ "Egypt", 97_553_151 }
};
public static IDictionary<string, int> GetEuropeanCountries() => new Dictionary<string, int>{
{ "Russia", 146_864_513 },
@mariusGundersen
mariusGundersen / Example6.cs
Created October 21, 2018 12:18
Duct-typed extension methods Example 6
// Example 6: Add a list
// This is just a dummy method that returns some ints
public static IEnumerable<int> GetAnotherListOfInts()
=> new[] { 10, 11, 12, 13 };
// With this extension method...
public static void Add<T>(this List<T> list, IEnumerable<T> items)
=> list.AddRange(items);
@mariusGundersen
mariusGundersen / Example5.cs
Created October 21, 2018 12:09
Duct-type extension methods Example 5
using System.Runtime.CompilerServices;
using System.Threading.Tasks;
// Example 5: await tuple of Tasks
// Just some dummy async functions
public static Task<string> GetSomethingAsync(int number) => Task.FromResult($"Something {number}");
public static Task<int> GetAnotherThingAsync(string text) => Task.FromResult(text.Length);
// This extension method lets us await a tuple with two values
@mariusGundersen
mariusGundersen / Example4.cs
Created October 21, 2018 11:18
Duct-typed extension methods Example 4
using System.Runtime.CompilerServices;
using System.Threading.Tasks;
// Example 4: await IEnumerable<Task<T>>
// Just a dummy async function
public static Task<string> GetSomethingAsync(int number) => Task.FromResult($"Something {number}");
// This extension method allows us to await many tasks
public static TaskAwaiter<T[]> GetAwaiter<T>(this IEnumerable<Task<T>> manyTasks)
@mariusGundersen
mariusGundersen / Example3.cs
Last active October 21, 2018 11:12
Duct-typed extension methods Example 3
using System.Runtime.CompilerServices;
using System.Threading.Tasks;
// Example 3: await Lazy<Task<T>>
// Just a dummy async function
public static Task<string> GetSomethingAsync(int number) => Task.FromResult($"Something {number}");
// We need a lazy variable to work with
var lazySomething = new Lazy<Task<string>>(() => GetSomethingAsync(10));
@mariusGundersen
mariusGundersen / Example2.cs
Created October 21, 2018 10:58
Duct-typed extension methods, example 2
using System.Runtime.CompilerServices;
using System.Threading.Tasks;
// Example 2: await anything
public static TaskAwaiter<T> GetAwaiter<T>(this T nonAwaitable)
=> Task.FromResult(nonAwaitable).GetAwaiter();
// Now we can write code like this
await "Hello world";
await 100;