在一个方法中使用公共属性对子对象列表进行排序-C#

在一个方法中使用公共属性对子对象列表进行排序-C#,c#,C#,以下是班级结构: public class PriorityItem public class GenePriorityItem : PriorityItem public class DrugPriorityItem : PriorityItem public class VariantPriorityItem : PriorityItem 我想实现一种方法,可以根据这些项目的公共属性对它们的列表进行排序(PriorityItem有10个属性) 我试过: protected IEnumera

以下是班级结构:

public class PriorityItem
public class GenePriorityItem : PriorityItem
public class DrugPriorityItem : PriorityItem
public class VariantPriorityItem : PriorityItem
我想实现一种方法,可以根据这些项目的公共属性对它们的列表进行排序(
PriorityItem
有10个属性)

我试过:

protected IEnumerable<PriorityItem> SortResults(string expression, SortDirection direction, IEnumerable<PriorityItem> results)
但我不能这么做:

SortResults(expression, direction, (List<PriorityItem>)list)
编译器告诉我它不能向下转换继承树(这是有意义的)


我怎样才能避开这件事?我真的不想为每个类编写4个方法。

您可以使用.OfType和.ToList()运算符:

list = SortResults(expression, direction, (IEnumerable<PriorityItem>)list)
               .OfType<VariantPriorityItem>()
               .ToList();
list=SortResults(表达式、方向、(IEnumerable)列表)
第()类
.ToList();

将方法声明为带约束的泛型方法

protected IEnumerable<P> SortResults<P>
(string expression, SortDirection direction, IEnumerable<P> results) 
where P: PriorityItem

在一个小测试中,类似的东西似乎对我有效:

using System.Collections.Generic;
using System.Linq;

namespace SortTest
{
    class Program
    {
        public static IEnumerable<T> Sort<T>(IEnumerable<T> list) where T : BaseType
        {
            return list.OrderByDescending(a => a.SortOrder);
        }

        static void Main(string[] args)
        {

            List<Type1> theList = new List<Type1>();
            for (int i = 0; i < 10; i++)
            {
                theList.Add(new Type1() { SortOrder = i });
            }

            theList = Sort(theList).ToList();

        }
    }

    public class BaseType { public int SortOrder { get; set; } }
    public class Type1 : BaseType { }
}
使用System.Collections.Generic;
使用System.Linq;
名称空间排序集
{
班级计划
{
公共静态IEnumerable排序(IEnumerable列表),其中T:BaseType
{
返回list.OrderByDescending(a=>a.SortOrder);
}
静态void Main(字符串[]参数)
{
列表列表=新列表();
对于(int i=0;i<10;i++)
{
Add(新类型1(){SortOrder=i});
}
theList=Sort(theList.ToList();
}
}
公共类基类{public int SortOrder{get;set;}}
公共类Type1:基类型{}
}

您如何对它们进行排序?排序规则是否易变?我不清楚,当你只需要能够排序
PriorityItem
时,为什么你要麻烦地强制转换所有内容。如果他总是将结果存储在一个列表中,他甚至可以将返回类型定义为
list

,因为列表可以存储在IEnumerable变量中。你能扩展这个吗?有什么理由像利亚姆在下面建议的那个样使用这种类型吗?@pQuestions123,是的。考虑这样的例子<代码> SortResults(表达式、方向、((iQueDaby))新列表{NealPrimoReItIm()、新PrimoReItIm())< /代码>;code>.OfType()将返回空sequense@pQuestions123此外,与类型相比,类型的好处至少是输入更少,可读性更好:)=>不再强制转换方法参数,之后不需要调用扩展方法
protected IEnumerable<P> SortResults<P>
(string expression, SortDirection direction, IEnumerable<P> results) 
where P: PriorityItem
list = SortResults(expression, direction, list).ToList()
using System.Collections.Generic;
using System.Linq;

namespace SortTest
{
    class Program
    {
        public static IEnumerable<T> Sort<T>(IEnumerable<T> list) where T : BaseType
        {
            return list.OrderByDescending(a => a.SortOrder);
        }

        static void Main(string[] args)
        {

            List<Type1> theList = new List<Type1>();
            for (int i = 0; i < 10; i++)
            {
                theList.Add(new Type1() { SortOrder = i });
            }

            theList = Sort(theList).ToList();

        }
    }

    public class BaseType { public int SortOrder { get; set; } }
    public class Type1 : BaseType { }
}