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

时间:2015-04-17 18:46:38

标签: c#

这是类结构:

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)

我决定使用IEnumerable而不是List的原因是因为我可以施放:

var list = new List<VariantPriorityItem>()
SortResults(expression, direction, (IEnumerable<PriorityItem>)list)

但我不能这样做:

SortResults(expression, direction, (List<PriorityItem>)list)

然而,所有这些对我没有任何好处,因为我无法将结果分配回List

list = SortResults(expression, direction, (IEnumerable<PriorityItem>)list)

编译器告诉我它不能抛弃继承树(这是有道理的)。

我该如何解决这个问题?我真的不想为每个类编写4个方法。

3 个答案:

答案 0 :(得分:2)

将方法声明为带约束的通用

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

然后按如下方式调用sort

list = SortResults(expression, direction, list).ToList()

答案 1 :(得分:0)

您可以使用.OfType&lt; T>和.ToList()运算符:

list = SortResults(expression, direction, (IEnumerable<PriorityItem>)list)
               .OfType<VariantPriorityItem>()
               .ToList();

答案 2 :(得分:0)

这样的事情在一个小小的测试中似乎对我有用:

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 { }
}