C# 在C中按共享属性对不同对象的列表进行排序#
我有课C# 在C中按共享属性对不同对象的列表进行排序#,c#,asp.net,.net,entity-framework,C#,Asp.net,.net,Entity Framework,我有课信息 public DateTime DateCreated {get; set;} public int MessageId {get; set;} 我还有课活动: public DateTime DateCreated {get; set;} public int ActivityId {get; set;} 在我的数据库中,我使用EF查询两个项目: db.Messages.ToList(); db.Activities.ToList(); 我需要将这两个列表放入一个列表中
信息
public DateTime DateCreated {get; set;}
public int MessageId {get; set;}
我还有课活动
:
public DateTime DateCreated {get; set;}
public int ActivityId {get; set;}
在我的数据库中,我使用EF查询两个项目:
db.Messages.ToList();
db.Activities.ToList();
我需要将这两个列表放入一个列表中,然后按创建日期排序。我可以使用继承使活动和消息从一些通用的“日期”类继承,但感觉很混乱,特别是因为这些类已经从其他类继承了
实现这一目标的正确方法是什么 带有接口
public interface IDatedObject
{
DateTime DateCreated {get;}
}
现在让这两个类实现接口并存储在接口列表中。在这种情况下,您可以使用接口:
public interface IDateCreated
{
DateTime DateCreated { get; set; }
}
在类中实现此接口,然后创建
var list = new List<IDateCreated>();
list.AddRange(db.Messages.ToList());
list.AddRange(db.Activities.ToList());
var result = list.OrderBy(x => x.DateCreated);
var list=newlist();
list.AddRange(db.Messages.ToList());
list.AddRange(db.Activities.ToList());
var result=list.OrderBy(x=>x.DateCreated);
当合并到一个列表中时,所有元素应具有相同的类型,而您没有中间类型,请尝试匿名类型:
var list = db.Messages.ToList().Select(x=>new{x.DateCreated, Id = x.MessageId})
.Concat(db.Activities.ToList().Select(x=>new{x.DateCreated,Id = ActvitiyId})
.OrderBy(x=>x.DateCreated).ToList();
您可以使用
System.Collections.SortedList
,其添加方法包括一个键和值参数:这将返回一个列表
,这意味着任何项目都可以是消息
或活动
,要将项目正确转换为基础类型,并相应地访问MessageId
或ActivityId
,应该考虑到这一点。是的,如果提问者需要重新向下转换到Message
或Activity
,他们需要对照类型进行检查,这会降低一些性能。如果以后向上转换是一个优先事项,那么保持该类型信息将非常有用(向下转换时信息实际上会丢失)。如果性能是超关键的,则将类型信息存储在IDateCreated
上的enum
中可以防止检查的性能开销,如If(x是消息)…
从共享接口派生它们是这里的一项要求,因为您规定它们必须在相同的列表中结束。即使您确实开发了一种对活动
和消息
进行排序的方法,您也必须将它们向上投射到对象
,以便它们最终都进入列表
。这就是人们推荐界面的原因。尽管函数式程序员会指出,如果你拼命不想升级到commmon界面,那么这种情况下,一个歧视性的联盟将大放异彩。@AdamKewley-谢谢你。如果在评估这些选项时,速度是最重要的标准,那么接口和上传仍然是最佳选择吗?是的,因为上传是一种相对较低的开销操作。在使用我想象中的上溯形式时,vtable查找会对性能造成很小的影响。导致List
的解决方案在排序过程中不一定会有很大的开销。但是,使用之后的内容将需要向下转换(到活动
或消息
),这通常对编译器不太友好(在运行时执行)且性能较低。