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

时间:2015-06-02 18:07:31

标签: 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; }
}

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

}

我有一个包含Order项目的列表(所有约会列表都是空的)和一个包含所有约会的列表,我不知道如何匹配两个列表中的元素以获得具有所有相应约会的Order对象(基于OrderId)。

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

3 个答案:

答案 0 :(得分:3)

首先,按if(Mage::getSingleton('customer/session')->isLoggedIn()) { $customerData = Mage::getSingleton('customer/session')->getCustomer(); echo $customerData->getId(); }制作Appointment词典:

OrderId

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

Appointments

foreach (var order in orders) { List<Appointment> appointmentList; if (appointmentByOrderId.TryGetValue(order.Id, out appointmentList) { order.Appointments = appointmentList; } else { order.Appointments = new List<Appointment>(); } } 分支是可选的。如果您不想将空列表设置为具有空约会列表的订单,则可以将其删除。

答案 1 :(得分:1)

构建Dictionary<Guid, Order>,并使用您的所有订单填充它。然后浏览约会列表并添加到正确的订单。例如(假设您有一个名为Orders的列表和一个名为Appointments的列表):

var OrdersDictionary = Orders.ToDictionary(o => o.Id, o => o);

foreach (var appt in Appointments)
{
    OrdersDictionary[appt.OrderId].Appointments.Add(appt);
}

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

答案 2 :(得分:1)

一种方法是&#34;分组加入&#34;两个列表并投射一个新集合:

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个对象 - 如果不希望这样做,另一个选择就是遍历所有订单并且&#34;附加&#34;匹配的约会 - 使用ToLookup对它们进行预分组:

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

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