2010-11-24 11 views
2

こんにちはみんな - 私はこの問題に悩まされていて、それを処理する最良の方法が何であるか不思議です。ループ内のループ

Foreach (var customer in CustomerList) 
{ 
     Foreach (var appointment in AppointmentList) 
     { 
     if(appointment.customerId == customer.id) 
      customer.appointments.add(appointment) 


     } 

} 

これは私がそれを行うと考えることができる最も簡単な方法ですが、それが最も効率的かどうかわかりません!

助けがあれば助かります。

ありがとうございます。

答えて

2

お客様の場合は、短いリストを事前にグループ化してください。これはあなたに良いパフォーマンスを与えるはずです - の正確な big-Oの評価は引用できませんが、になる可能性がありますO(n * m) 。

var apptsByCustomer = AppointmentList.ToLookup(appt => appt.customerId); 

、あなたが使用することができます。

foreach (var customer in CustomerList) { 
    foreach(var appointment in apptsByCustomer[customer.id]) { 
     customer.appointments.add(appointment); 
    } 
} 

またはLINQなし(コメントから):これについて

// this bit is **broadly** comparable to ToLookup... 
Dictionary<int, List<Appointment>> apptsByCustomer = 
    new Dictionary<int, List<Appointment>>(); 
List<Appointment> byCust; 
foreach(Appointment appt in AppointmentList) {    
    if (!apptsByCustomer.TryGetValue(appt.customerId, out byCust)) { 
     byCust = new List<Appointment>(); 
     apptsByCustomer.Add(appt.customerId, byCust); 
    } 
    byCust.Add(appt); 
} 

foreach (Customer cust in CustomerList) { 
    if (apptsByCustomer.TryGetValue(cust.id, out byCust)) { 
     foreach (Appointment appt in byCust) cust.appointments.Add(appt); 
    } 
} 
+0

コンパイルできますか? IGroupingにインデクサがないと思った?あなたはToLookupを使いたいですか? ToLookupを使用する場合は、(ほとんど)O(n + m)にする必要があります。 – CodesInChaos

+0

@CodeInChaos -Do!私は確かにToLookupを意味した –

+0

それは私に良いprittyに見える - 悲しいことに、私たちはlinqを使用することはできません。 – Steoates

2

何?

foreach (var customer in CustomerList) 
{ 
    customer.AddRange(appointment.Where(a => a.CustomerId == customer.id)); 
} 

私にとっては、これは明確で簡潔な構文のように思えますが、それは非常に良いことを説明しています。

また、パフォーマンスはここでは問題なく、おそらく元のコードとほぼ同じであるはずです。あなたはこのように、ループからネスト削除するためにLINQを使用することができ

0

foreach (var customer in from customer in CustomerList 
     from appointment in AppointmentList 
     select customer) 
{ 
    // ... 
} 
+0

これはどのようにして顧客の予定リストに予定を追加するのですか? –

0

をあなたのcustomerListDictionaryではなく<id, cust>から成る作ることができます。

その後、代わりにあなたがtry to get the value

Dictionary<int, Customer> customerList = new Dictionary<int, Customer>(); 
// populate your list 
// ... 
foreach (var appointment in AppointmentList) 
{ 
    Customer customer; 
    if (customerList.TryGetValue(appointment.customerID, out customer)){ 
     // found the customer 
     customer.appointments.add(appointment) 
} 

この方法は、リストをループで、あなたは辞書があなたのためにそれを最適化しましょう。
このアクションを1回だけ実行すると、という著しい減速が見られる場合を除き、を最適化する価値はないでしょう。 Premature optimization is not really worth the effort