CSharp incantations - June 2023
CSharp for the second time.
I last did CSharp 11 years ago. So, I have forgotten most of it. I notice loads of features in common with Scala, Java, Rust, and so on, but that doesn’t change the fact that the syntax is unique and these notes are my memory joggers.
Arrays
string [] Days = {"M", "T", "W", "T", "F", "S", "S"};
var Days1 = new[]{"M", "T", "W", "T", "F", "S", "S"};
A jagged array has arrays within it of differing sizes
int [][] arrays = new int[3][] {
new [] {1,2},
new [] {1,2,3},
new [] {1},
}
A rectangular array has a different way to declare it
int [,]rect = new int[5,7];
var anotherRect = new int[,]
{
{1,2},
{3,4},
}
Index from end operator
You can use ^0 to mean the length, ^1 to mean the last item. Its an operator.
var array = new int[]{1,2,3};
var third = array[2];
var last = array[^1];
Range operator
var array = new int[]{1,2,3,4,5};
var slice1 = array[2..^3]; // array[new Range(2, new Index(3, fromEnd:true))];
var slice2 = array[..^3]; // array[Range.EndAt(new Index(3, fromEnd:true))];
var slice3 = array[2..]; // array[Range.StartAt(2)];
var slice4 = array[..]; // array[Range.All];
There is even an Index type which can hold the end relative index values
Index last = ^1;
Iterator via yield
public static IEnumerable<int> Countdown(int start, int end)
{
for (int i = start; i >= end; --i)
{
yield return i; // You can see this is generating the IEnumerable
}
}
Tuples
ValueTuple use structs (ie values) and are the default when you declare a tuple.
There is an older form of just Tuple which are all classes.
Returning a tuple
public static (int x, int y) Pos() => (10,20);
Dictionary
var monLookup = new Dictionary<string, int>
{
{"Jan", 1}, // compiler calls Add
{"Feb", 2},
};
var monLookup1 = new Dictionary<string, int>
{
["Jan"] = 1, // compiler uses Indexer
["Feb"] = 2,
};