Posts

Showing posts from June, 2016

Returning an IEnumerable from a database

This is probably rather obvious, but... when returning an `IEnumerable` from a database, like the records from a table, don't do this: using (var db = GetDatabase()) { return db.GetTable("Table1"); } because it will throw an exception when trying to enumerate those records, since the database connection has already been disposed. Don't do this either: using (var db = GetDatabase()) { return db.GetTable("Table1").ToList(); } because it will retrieve all records from the table, even if you only need a small subset. A slightly better way is to do this: using (var db = GetDatabase()) { foreach (var item in db.GetTable("Table1")) yield return item; } This way, the `Dispose` method doesn't get called until the enumeration is over and if you only `Take()` a limited number of records from the result, it won't load the whole table. On the other hand, if you only add `Where()` clauses to the result, it will still enumerate every...

Aligning text

I needed to write some code in a console app to align what a user was saying, in case it was longer than a line (80 characters): marcel: blah blah blah a lot of text that doesn't fit in 80 characters more blah blah blah long_username: Contrary to popular belief, Lorem Ipsum is not simply random text . It has roots in a piece of classical Latin literature from 45 B C, making it over 2000 years old. Richard McClintock, a Latin pro fessor at Hampden-Sydney College in Virginia, looked up one of th I wrote the code in two ways: an imperative, mutating style and a functional (recursive) style. I find the second one to be more elegant but since the entire project is something done as a hobby I don't much care about speed; your mileage might vary. I'm also quite certain the first method can be improved but… again, I don't need to do that so it doesn't get done. As usual, use at your own risk, I don't care about c...

Math is a game

Math is a game, an arbitrary set of symbols and rules. The weird part, the part that always surprises me, is that it's relevant to the real world. Here's an example: we'll start with just two symbols, Yin and Yang. (Replace those with black and white, circle and square, X and Y… whichever two symbols you prefer.) What can we do with them? Well, the simplest thing we can do is transform one into the other: Yin → Yang; Yang → Yin We'll call this transformation "mirroring" and denote it with the letter "M". What about combining two symbols? We have a number of possibilities: A) Yin, Yang → Yin; Yang, Yin → Yin; Yin, Yin → Yin; Yang, Yang → Yin This is rather boring… no matter what we start with, we obtain an Yin symbol. Nevertheless, let's continue. B) The opposite of A: Yin, Yang → Yang; Yang, Yin → Yang; Yin, Yin → Yang; Yang, Yang → Yang. Still boring. C) Yin, Yang → Yin; Yang, Yin → Yin; Yin, Y...

Parsing INI files

I am trying to allow the end user to modify the application behavior in some limited ways; as such, I have a need of parsing .INI files of the form [Type 1] contains=abc contains=def [Type 2] contains=1234 I looked around for a class / library that would allow me to read these files but I haven't found anything useful (most of the classes I found couldn't handle duplicate keys within the same section). As such, I went ahead and implemented this myself. This algorithm is extremely specific to my usage, you might have to modify it for your needs. The IniTuple represents each line as a (section, key, value) tuple: public class IniTuple { public string Section { get; private set; } public string Key { get; private set; } public string Value { get; private set; } public IniTuple(string section, string key, string value) { Section = section; Key = key; Value = value; } } The IniP...