Lets say we have some types defined as so:
public class BaseClass
{
public int Value { get; set; }
}
public class SubClassA : BaseClass
{
public bool SomeBoolValue { get; set; }
}
public class SubClassB : BaseClass
{
public decimal SomeDecimalValue { get; set; }
}
And we construct two lists of the sub class type like this
List<SubClassA> subClassAList = new List<SubClassA>
{
new SubClassA {SomeBoolValue = true, Value = 0},
new SubClassA {SomeBoolValue = true, Value = 2},
new SubClassA {SomeBoolValue = false, Value = 1},
};
List<SubClassB> subClassBList = new List<SubClassB>
{
new SubClassB {SomeDecimalValue = 1.3M, Value = 2},
new SubClassB {SomeDecimalValue = 3.5M, Value = 1},
new SubClassB {SomeDecimalValue = 0.2M, Value = 5},
};
Is there a way we can implement a function that can can filter both subClassAList and subClassBList on the Value property? I know this can be achieved through casting the results of a function like so:
public static IEnumerable<BaseClass> OrderList(IEnumerable<BaseClass> list)
{
return list.OrderBy(x => x.Value);
}
...
...
orderedAList = OrderList(subClassAList)
.Cast<SubClassA>() //Don't like requiring a cast. Unsafe.
.ToList();
But then we need to cast the results to get it back into the subclass list which doesn't seem very typesafe. I know the ordering operation in itself is very simple and it probably doesn't warrant a separate function to do the action, but if you were trying to do something more complex than ordering, it would be helpful to contain the logic to a single function/class/whatever in order to do achieve it rather than copying code.
You could accomplish this using a generic method.
public static IEnumerable<T> OrderList<T>(IEnumerable<T> list) where T : BaseClass
{
return list.OrderBy(x => x.Value);
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With