While building some ugly code to walk the Lucene.NET Query graph, I found myself needing two bits of functionality from C# that it sadly doesn’t provide. There are arguments for and against each of these, but they certainly would have saved me some pain today.
Switching off of System.Type
The Lucene query graph is a nasty beast. There’s an abstract base Query class, but no common way to iterate through the graph and extract criteria. Instead, you have to process each concrete type separately. An easy way to do this would be to use a switch statement off of the concrete query type and execute the corresponding logic to process the type. Unfortunately, the C# switch statement only supports types that are convertible to Integer (and strings). There are solutions, such as this, but why isn’t it built in to the framework? Peter Hallam explains the reasons, but I don’t agree with most of his argument. Visual Basic’s equivalent of a switch statement allows for case statements to “overlap”, and it doesn’t seem to be causing catastrophic problems there. I think it’s actually quite intuitive to expect that only the first matching case statement would be executed. In any case, I’d love to see this added to C#.
Using ‘yield return’ to directly return an IEnumerable
The ‘yield return’ statement is incredibly useful, but I’ve found myself on multiple occasions using it to enumerate a hierarchical object graph. In such situations, it’s quite annoying that I can’t just ‘yield return’ the entire child object IEnumerable list at once. Instead, I have to manually iterate the child list and ‘yield return’ each result individually. I see no reason (at all) why this extra step should be necessary. Wes describes a possible way to implement this feature, and there’s a (closed as won’t fix) issue on Microsoft Connect with a slew of votes.