This is inefficient because .Contains() uses the same check as GetAttributeValue(), which internally refers to the actual entry location. The lookup functionality (finding the value of a key in a collection) is duplicated.
Use TryGetValue() instead
Last week I posted a set of useful extension methods to shorten our C# code, making it more readable and in some cases more efficient. Add a new extension method:This method tries to get an attribute's value and returns true if the attribute exists. Crucially, it also returns the value of the attribute if it exists, as an out parameter.
We can now rewrite our code to get the value for address 1 line 1 and only iterate through the attribute collection once:
It's important to remember that this is a micro-optimisation. We should still consider whether slightly more optimised code is actually worth it i.e. does it sacrifice code readability?
This post was inspired by a recent pull request from the .NET Roslyn compiler which is open-source and hosted here on GitHub.
Finally, for the curious, the performance difference between TryGetValue and Contains is discussed further here on StackOverflow.
No comments:
Post a Comment