I have a list of numbers, and I wrote a method that performs some calculations on these numbers; all in all, it’s about a page of code. The method performs some arithmetic and comparisons on these numbers.
My problem is that, in one case, the list is an IList<byte>, and in another case, it’s an IList<float>. The algorithm in both cases is exactly the same (yes, I’m aware of things like overflow errors and loss of precision, but in my case it works). How can I write a method that will handle both lists ? I can’t write something like void DoStuff<T>(IList<T> numbers), because there are no arithmetic operators (+ - * /) that are generic.
One solution is to simply store everything as float, but I’d like to avoid it. The lists are quite long, and thus storing floats instead of bytes would cost too much memory. I could also do something like DoStuffFloat(byteList.Select(b => (float)b)), but I don’t want to pay the performance penalty, either, if I can avoid it.
Short of copy-pasting the entire method and replacing “float” with “byte” (or vice versa), is there some decent solution ?
EDIT: I should’ve mentioned that I’m restricted to using .NET 3.5 for this project.
I don’t know if this is the best method for your case but it is useful for similar cases too.
This can be done by using the
dynamickeyword. What dynamic will do is it will not do the compile time checks until runtime.Here is a small sample program to show how it works.
Unfortunately in my quick testing I could not make
IList<dynamic> workhowever using the non genericIListthen accessing the members as adynamicworks fine.