编写一个函数来过滤一个项目列表,通过它在c#中的基类型

elt*_*mmo 5 c# linq types

让我们说我们有一些类型定义如下:

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; }
}
Run Code Online (Sandbox Code Playgroud)

我们像这样构造两个子类类型的列表

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},
};
Run Code Online (Sandbox Code Playgroud)

有没有办法可以实现一个可以在Value属性上过滤subClassAList和subClassBList的函数?我知道这可以通过转换函数的结果来实现,如下所示:

    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();
Run Code Online (Sandbox Code Playgroud)

但是接下来我们需要将结果转换回子类列表,这似乎不是非常类型安全的.我知道排序操作本身非常简单,它可能不保证单独的函数来执行操作,但如果您尝试执行比排序更复杂的操作,将逻辑包含到单个函数中会很有帮助/ class /无论为了实现它而不是复制代码.

Max*_*ton 3

您可以使用通用方法来完成此任务。

public static IEnumerable<T> OrderList<T>(IEnumerable<T> list) where T : BaseClass
{
return list.OrderBy(x => x.Value);
}
Run Code Online (Sandbox Code Playgroud)