2015-06-02 50 views
1

突然想到說,我有以下兩種模式:方式完成從兩個列表樹與匹配的ID

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; } 

} 

我有訂單項目(所有的約會空表)的列表和一個包含所有約會的列表,我不知道如何匹配這兩個列表中的元素,以獲取包含所有相應約會(基於OrderId)的Order對象。

我該如何以有效的方式做到這一點?我不想遍歷所有訂單,並指定相應的約會。

+2

你到目前爲止嘗試過什麼?什麼沒有用?你有什麼方法來填充'約會'?你使用EF,ADO等嗎?一旦我們看到你已經嘗試了什麼或者你在用什麼來填充你的實體,這很容易。 – ragerory

+0

不應該將'Order'對象的任何實例上的'Appointments'屬性填充到數據存儲中相應的'Appointment'對象中?真的不清楚問題是什麼。你在哪裏獲得這些類的實例,以及它們如何填充數據? – David

+0

我用Nhibernate標準工作,這個例子要複雜得多,但是在2個連接之後,在2DTO的OrderDto和AppointmentsDto映射之後,我必須以某種方式高效地合併它們 –

回答

1

的一種方法是,以「集團加入」兩個列表和項目的新集合:

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(); 
+0

這就是我正在尋找的!謝謝! –

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的方式來做到這一點彙總所有在單個語句,但我並沒有花時間來困擾它出。

3

首先,使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>(); 
    } 
} 

else分支是可選的。如果您不想爲具有空白預約列表的訂單設置空列表,可以將其刪除。