I have a specialized list that holds items of type IThing:
public class ThingList : IList<IThing> {...} public interface IThing { Decimal Weight { get; set; } Decimal Velocity { get; set; } Decimal Distance { get; set; } Decimal Age { get; set; } Decimal AnotherValue { get; set; } [...even more properties and methods...] }
Sometimes I need to know the maximum or minimum of a certain property of all the things in the list. Because of ‘Tell don’t ask’ we let the List figure it out:
public class ThingList : IList<IThing> { public Decimal GetMaximumWeight() { Decimal result = 0; foreach (IThing thing in this) { result = Math.Max(result, thing.Weight); } return result; } }
Thats very nice. But sometimes I need the minimum weight, sometimes the maximum velocity and so on. I don’t want a GetMaximum*()/GetMinimum*() pair for every single property.
One solution would be reflection. Something like (hold your nose, strong code smell!):
Decimal GetMaximum(String propertyName); Decimal GetMinimum(String propertyName);
Are there any better, less smelly ways to accomplish this?
Thanks, Eric
Edit: @Matt: .Net 2.0
Conclusion: There is no better way for .Net 2.0 (with Visual Studio 2005). Maybe we should move to .Net 3.5 and Visual Studio 2008 sometime soon. Thanks, guys.
Conclusion: There are diffent ways that are far better than reflection. Depending on runtime and C# version. Have a look at Jon Skeets answer for the differences. All answers are are very helpful.
I will go for Sklivvz suggestion (anonymous methods). There are several code snippets from other people (Konrad Rudolph, Matt Hamilton and Coincoin) which implement Sklivvz idea. I can only ‘accept’ one answer, unfortunately.
Thank you very much. You can all feel ‘accepted’, altough only Sklivvz gets the credits 😉
Yes, you should use a delegate and anonymous methods.
For an example see here.
Basically you need to implement something similar to the Find method of Lists.
Here is a sample implementation
The results:
Max by date: I: 4, S: w, D: 10/3/2008 12:44:07 AMMin by char: I: 5, S: v, D: 9/29/2008 12:44:07 AM