Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在C中按共享属性对不同对象的列表进行排序#_C#_Asp.net_.net_Entity Framework - Fatal编程技术网

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
的解决方案在排序过程中不一定会有很大的开销。但是,使用之后的内容将需要向下转换(到
活动
消息
),这通常对编译器不太友好(在运行时执行)且性能较低。