繁体   English   中英

在一种方法中使用通用属性对子级列表进行排序-C#

[英]Sorting on lists of children using common attributes in one method - 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个方法。

将方法声明为具有约束的泛型

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

然后调用如下的排序

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

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

list = SortResults(expression, direction, (IEnumerable<PriorityItem>)list)
               .OfType<VariantPriorityItem>()
               .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 { }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM