C# 从两个具有匹配ID的列表创建树的方法

C# 从两个具有匹配ID的列表创建树的方法,c#,C#,假设我有以下两种型号: public class Order { public Guid Id { get; set; } public string Name { get; set; } public string Location { get; set; } public string Street { get; set; } public IList<Appointment> Appointments { get; set; } } p

假设我有以下两种型号:

public class Order
{
    public Guid Id { get; set; }
    public string Name { get; set; }
    public string Location { get; set; }
    public string Street { get; set; }
    public IList<Appointment> Appointments { get; set; }
}

public class Appointment
{
    public Guid Id {get; set;}
    public DateTime StartDate {get; set;}
    public DateTime EndDate {get; set;}
    public Guid OrderId { get; set; }

}
公共类秩序
{
公共Guid Id{get;set;}
公共字符串名称{get;set;}
公共字符串位置{get;set;}
公共字符串Street{get;set;}
公共IList约会{get;set;}
}
公开课任命
{
公共Guid Id{get;set;}
公共日期时间起始日期{get;set;}
公共日期时间结束日期{get;set;}
公共Guid OrderId{get;set;}
}
我有一个包含订单项的列表(所有的约会列表都为空)和一个包含所有约会的列表,我不知道如何匹配这两个列表中的元素,以便获得包含所有相应约会的订单对象(基于OrderId)

我怎样才能有效地做到这一点?我不想遍历所有订单,并分配相应的约会。

构建一个
字典,并用所有订单填充它。然后浏览约会列表并按正确顺序添加。例如(假设您有一个名为
订单
的列表和一个名为
约会
的列表):

可能有一种LINQ方法可以在一条语句中汇总所有内容,但我没有花时间来解决这个问题。

构建一个
字典,并用所有订单填充它。然后浏览约会列表并按正确顺序添加。例如(假设您有一个名为
订单
的列表和一个名为
约会
的列表):

可能有一种LINQ方法可以在一条语句中完成汇总,但我没有花时间去解决它。

一种方法是将两个列表“分组”并投影一个新集合:

var neworders = 
    from o in orders
    join a in appointments
      on o.Id equals a.OrderId 
      into g
    select new Order
    {
       Id = o.Id,
       Name = o.Name,
       Location = o.Location,
       Street = o.Street,
       Appointments = g.ToList()
    };
显然,这会创建新的
Order
对象-如果不需要,另一个选项是循环所有订单并“附加”匹配的约会-使用
ToLookup
对它们进行预分组:

var groups = appointments.ToLookup(a => a.OrderId);

foreach(var o in orders)
    o.Appointments = groups[o.Id].ToList();
一种方法是“分组加入”两个列表,并投影一个新集合:

var neworders = 
    from o in orders
    join a in appointments
      on o.Id equals a.OrderId 
      into g
    select new Order
    {
       Id = o.Id,
       Name = o.Name,
       Location = o.Location,
       Street = o.Street,
       Appointments = g.ToList()
    };
显然,这会创建新的
Order
对象-如果不需要,另一个选项是循环所有订单并“附加”匹配的约会-使用
ToLookup
对它们进行预分组:

var groups = appointments.ToLookup(a => a.OrderId);

foreach(var o in orders)
    o.Appointments = groups[o.Id].ToList();

首先,通过
OrderId
,为约会制作一个字典:

var appointmentByOrderId = appointments
    .GroupBy(a => a.OrderId)
    .ToDictionary(g => g.Key, g => g.ToList());
然后浏览
订单
s列表,并将
约会
设置为字典中的列表:

foreach (var order in orders) {
    List<Appointment> appointmentList;
    if (appointmentByOrderId.TryGetValue(order.Id, out appointmentList) {
        order.Appointments = appointmentList;
    } else {
        order.Appointments = new List<Appointment>();
    }
}
foreach(订单中的变量顺序){
名单任命名单;
if(appointmentByOrderId.TryGetValue(order.Id,out appointmentList){
order.Appointment=任命列表;
}否则{
order.appoints=新列表();
}
}

else
分支是可选的。如果您不想将空列表设置为带有空约会列表的订单,可以将其删除。

首先,通过
OrderId
创建一个约会字典:

var appointmentByOrderId = appointments
    .GroupBy(a => a.OrderId)
    .ToDictionary(g => g.Key, g => g.ToList());
然后浏览
订单
s列表,并将
约会
设置为字典中的列表:

foreach (var order in orders) {
    List<Appointment> appointmentList;
    if (appointmentByOrderId.TryGetValue(order.Id, out appointmentList) {
        order.Appointments = appointmentList;
    } else {
        order.Appointments = new List<Appointment>();
    }
}
foreach(订单中的变量顺序){
名单任命名单;
if(appointmentByOrderId.TryGetValue(order.Id,out appointmentList){
order.Appointment=任命列表;
}否则{
order.appoints=新列表();
}
}

else
分支是可选的。如果您不想将空列表设置为带有空约会列表的订单,则可以将其删除。

到目前为止,您尝试了什么?什么不起作用?您有什么方法填充
约会
?您是否使用EF、ADO等?一旦我们看到您尝试了什么或您正在做什么,就很容易了正在初始化以填充实体。
Order
对象的任何实例上的
Appointment
属性不应该由数据存储中相应的
Appointment
对象填充吗?现在还不清楚问题出在哪里。这些类的实例是从哪里获得的,它们是如何填充的关于数据?我使用的是Nhibernate标准,这个例子要复杂得多,但是在2次联接之后,在2个DTO OrderDto和AppointsDTO上映射之后,我必须以某种方式合并它们,效率高到目前为止你尝试了什么?什么不起作用?你有什么方法填充
Appointment
?你在使用EF、ADO等吗?这是p一旦我们看到您尝试了什么或者您正在使用什么来填充您的实体,就很容易了。难道
订单
对象的任何实例上的
约会
属性不应该用数据存储中相应的
约会
对象填充吗?现在还不清楚问题出在哪里。您从哪里获得您的订单这些类的实例以及它们是如何被数据填充的?我正在使用Nhibernate标准,这个例子要复杂得多,但是在2次连接以及在2个DTO OrderDto和AppointsDTO上的映射之后,我必须以某种方式合并它们,效率很高这就是我要找的!谢谢!这就是我要找的!谢谢!