[英]Reduce multiple foreach loops in code C#
我寫了一個非常混亂的代碼,只是因為我不知道如何遍歷多個對象列表。
代碼正在按預期工作,但我對它沒有信心。 有人知道如何重構這種代碼以使其更具可讀性嗎?
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);
}
}
}
}
}
您可以使用 LINQ,尤其是SelectMany
和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();
您還可以使用 linq 查詢語法:
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);
}
}
如果您只想向下鑽取對象層次結構,那么您可以使用擴展方法或 linq:
// 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)
如果我是:
foreach (var outlet in merchant.Outlets)
{
if (outlet == null)
continue;
foreach (var terminal in merchant.Terminals)
{
if (terminal == null)
continue;
foreach (var agreement in terminal.AssociateAgreements)
{
if (agreement == null)
continue;
//TODO
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.