假设我有以下两种模式:
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)。
我怎样才能以有效的方式做到这一点?我不想遍历所有订单,并分配相应的约会..
答案 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();