[英]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.