這是我應該完成的任務的描述
這就是我的代碼。如果有人可以幫助我并解釋為什么我的解決方案不好,我將不勝感激。
public IList<MoneyTransfer> SearchTransfer(string clientAccountNo, decimal? amount,
string phrase, string beneficiaryAccountNo)
{
var listOfMoneyTransfers = new List<MoneyTransfer>();
var result = new List<MoneyTransfer>();
if (clientAccountNo is null)
{
return result;
}
else
{
foreach (BankAccount i in BankAccounts.ToList())
{
foreach (MoneyTransfer j in TransfersHistory.ToList())
{
if (i.AccountNo == clientAccountNo)
{
listOfMoneyTransfers.Add(j);
}
}
}
if (listOfMoneyTransfers.Count > 0)
{
foreach (var k in listOfMoneyTransfers)
{
if (k.Amount == amount || k.BeneficiaryAccountNo == beneficiaryAccountNo || k.Title == phrase)
{
result.Add(k);
}
}
}
}
return result;
}
在通過三個附加引數進行搜索時,這可能是錯誤的,但我不確定。請幫忙
private static string CorrectClientAccount =
"12345678901234567890000001";
[Test]
public void SearchTransferBy_BeneficiaryAccount()
{
var service = CreateService();
service.CreateTransfer(CorrectClientAccount, 250m,
"Transfer 1", "12345678901234567890000001");
service.CreateTransfer(CorrectClientAccount, 300m, "Other
2", "12345678901234567890000002");
service.CreateTransfer(CorrectClientAccount, 400m, "Other
3", "12345678901234567890000003");
service.CreateTransfer(CorrectClientAccount, 500m, "Other
4", "12345678901234567890000003");
var result = service.SearchTransfer(CorrectClientAccount,
null, "", "12345678901234567890000003");
Assert.IsNotNull(result);
Assert.AreEqual(2, result.Count);
Assert.IsTrue(result.Any(a => a.ClientAccountNo ==
CorrectClientAccount && a.Amount == 400m && a.Title ==
"Other 3" && a.BeneficiaryAccountNo ==
"12345678901234567890000003"));
Assert.IsTrue(result.Any(a => a.ClientAccountNo ==
CorrectClientAccount && a.Amount == 500m && a.Title ==
"Other 4" && a.BeneficiaryAccountNo ==
"12345678901234567890000003"));
}
那就是單元測驗
uj5u.com熱心網友回復:
這部分代碼看起來有問題:
foreach (BankAccount i in BankAccounts.ToList())
{
foreach (MoneyTransfer j in TransfersHistory.ToList())
{
if (i.AccountNo == clientAccountNo)
{
listOfMoneyTransfers.Add(j);
}
}
}
在查看銀行賬戶和轉賬時,您不會檢查轉賬是否屬于特定賬戶。
如果存在具有此 clientAccountNo 的銀行帳戶,則此代碼會將所有匯款添加到串列中,而不僅僅是屬于該客戶的轉賬。
很可能,你需要做這樣的事情(我只能猜測我沒有提供的變數名)
(這也假設 MoneyTransfer 沒有AccountNo)
var clientBankAccount = BankAccounts.FirstOrDefault(account => account.AccountNo == clientAccountNo);
// be sure to check that account has been found
foreach (MoneyTransfer j in TransfersHistory.ToList())
{
if (j.BankAccountId == clientBankAccount.Id)
{
listOfMoneyTransfers.Add(j);
}
}
uj5u.com熱心網友回復:
我將首先關注代碼的功能正確性,然后我們還可以討論效率。
功能問題:BankAccounts 和 TransferHistory 串列迭代之間沒有關系。如果那些來自 clientBankAccount 的轉賬歷史,我們將選擇所有轉賬歷史而不過濾,因為我們只是將 clinetAccountNumber 與外部迭代項(BankAccount i)匹配,如果該條件匹配,則包括所有轉賬。我們應該只過濾來自 clientBankAccount 的那些轉賬。
foreach (BankAccount i in BankAccounts.ToList())
{
foreach (MoneyTransfer j in TransfersHistory.ToList())
{
if ***(i.AccountNo == clientAccountNo)***
{
listOfMoneyTransfers.Add(j);
}
}
}
可能有很多優化,例如: 添加前置條件檢查,例如:
if (null == amount && string.IsNullOrWhilespace(beneficiaryAccountNo) && string.IsNullOrWhilespace(phrase))
{
return new List<MoneyTransfer>();
}
uj5u.com熱心網友回復:
foreach (MoneyTransfer j in TransfersHistory.ToList())
{
if (i.AccountNo == clientAccountNo)
{
listOfMoneyTransfers.Add(j);
}
}
您實際上并不需要外部回圈,而是檢查 j.ClientAccountNo == clientAccountNo,以獲取屬于正確帳戶的轉賬串列。
foreach (var k in listOfMoneyTransfers)
{
if (k.Amount == amount || k.BeneficiaryAccountNo == beneficiaryAccountNo || k.Title == phrase)
{
result.Add(k);
}
}
這也是一個問題,一旦滿足條件,運算式就會被縮短,因此它可能會導致它回傳與金額匹配但不匹配收款人帳號或包含搜索短語的匯款。
一旦滿足一個條件,其余的就不會被評估。
https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/operators/boolean-logical-operators#conditional-logical-or-operator-
考慮使用 Linq where 子句和條件搜索。就像是
var results = listOfMoneyTransfers
.Where(x => amount.HasValue ? x == amount : true)
.Where(x => string.InNullOrWhiteSpace(phrase) ? x.Title.contains(phrase) : true)
.Where(x => string.InNullOrWhiteSpace(beneficiaryAccountNo) ? x.BeneficiaryAccountNo == beneficiaryAccountNo : true)
多個 where 子句將被扁平化為單個謂詞https://github.com/dotnet/runtime/blob/a24364a09d9aea98b545f16689a53bafc6b18c14/src/libraries/System.Linq/src/System/Linq/Utilities.cs#L56
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/457629.html
