2016-05-13 8 views
1

Ich habe einen wirklich chaotischen Code geschrieben, nur weil ich keine Idee hatte, wie Sie durch die mehrere Liste der Objekte durchlaufen.Reduzieren Sie mehrere foreach Schleifen in Code C#

Code funktioniert, was er tun soll, aber ich bin nicht davon überzeugt. Hat jemand eine Idee, wie diese Art von Code umstrukturiert werden kann, damit sie besser lesbar ist?

foreach (var outlet in merchant.Outlets) 
{ 
    if (outlet != null) 
    { 
     foreach (var terminal in merchant.Terminals) 
     { 
      if (terminal != null) 
      { 
       foreach (var agreement in terminal.AssociateAgreements) 
       { 
        var bankInfo = new Bank(); 
        if (agreement != null) 
        { 
         bankInfo.UniqueID = AgreementUniqueCode + agreement.ID; 
         bankInfo.BankBIC = agreement.BankAccountInformation.SwiftBIC; 
         bankInfo.BankName = agreement.BankAccountInformation.BankName; 
         bankInfo.Address = 
          AddressEntityToAddress(agreement.BankAccountInformation.BankAddress, 
           BankingType); 

         bankInfo.type = BankType; 
        } 
        banksAccountInformation.Add(bankInfo); 
       } 
      } 
     } 
    } 
} 
+1

Verwenden Sie Methoden. Sie können Outlet eine Methode wie ProcessTerminals hinzufügen und eine zu Terminal wie ProcessAgreements. –

+0

Sie könnten diese Frage in 'Code Review' Stackoverflow stellen, hier nicht wirklich angemessen. –

+1

Sie können auch die if-Bedingungen entfernen, die mit NULL übereinstimmen, da foreach-Schleifen immer auf Werten in der Auflistung und Sammlung nicht die NULL-Einfügungen haben. – Shubhit304

Antwort

3

Sie können auch die Linq-Abfragesyntax verwenden:

var outletQuery = from outlet in merchant.Outlets 
        where outlet != null 
        select outlet; 

var agreementQuery = from terminal in merchant.Terminals 
        where terminal != null 
        from agreement in terminal.AssociateAgreements 
        select agreement; 

foreach (var outlet in outletQuery) 
{ 
    foreach (var agreement in agreementQuery) 
    { 
     ProcessAgreement(agreement); 
    } 
} 
4

Sie LINQ verwenden könnte, vor allem SelectMany und Where:

List<Bank> banksAccountInformation = merchant 
    .Where(m => m.Outlets != null && m.Terminals != null) 
    .SelectMany(m => m.Terminals 
     .SelectMany(t => t.AssociateAgreements 
      .Where(aa => aa != null) 
      .Select(aa => new Bank 
      { 
       UniqueID = AgreementUniqueCode + aa.ID 
       // ... 
      }))) 
    .ToList(); 
2

Wenn die einzige Sache, die Sie auf der Objekthierarchie bohrt möchten, dann können Sie extension methods oder Linq verwenden:

// here you get a flattened collection of Terminals 
merchants.SelectMany(m => m.Terminals) 
// here you get a flattened collection of all AssociateAgreements of all Terminals 
    .SelectMany(t => t.AssociateAgreements) 
Verwandte Themen