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上的映射之后,我必须以某种方式合并它们,效率很高这就是我要找的!谢谢!这就是我要找的!谢谢!