在一个方法中使用公共属性对子对象列表进行排序-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
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 { }
}