[英]Simplify list.add of unknown amount of entries
所以我目前正在研究計算器。
要求之一是存儲歷史記錄,我目前在列表中進行。
雖然我已經簡化了很多代碼,但我無法簡化這個
if (amountNumbers == 2)
{
memory.Add(userNumbers[0].ToString() + " " + op + " " + userNumbers[1].ToString() + " = " + calculation.ToString());
userNumbers.Clear();
}
if (amountNumbers == 3)
{
memory.Add(userNumbers[0].ToString() + " " + op + " " + userNumbers[1].ToString() + " " + op + " " + userNumbers[2].ToString() + " = " + calculation.ToString());
userNumbers.Clear();
}
if (amountNumbers == 4)
{
memory.Add(userNumbers[0].ToString() + " " + op + " " + userNumbers[1].ToString() + " " + op + " " + userNumbers[2].ToString() + " " + op + " " + userNumbers[3].ToString() + " = " + calculation.ToString());
userNumbers.Clear();
}
if (amountNumbers == 5)
{
memory.Add(userNumbers[0].ToString() + " " + op + " " + userNumbers[1].ToString() + " " + op + " " + userNumbers[2].ToString() + " " + op + " " + userNumbers[3].ToString() + " " + op + " " + userNumbers[4].ToString() + " = " + calculation.ToString());
userNumbers.Clear();
}
知道我如何簡化這個並根據用戶選擇的值來動態添加嗎? 最好我想將整個字符串存儲在一個索引中,因為這是顯示歷史的方式。
簡單,遍歷userNumbers
並構建您的字符串,然后在完成后將其添加到memory
。 像這樣:
// Ensure that we don't get an 'IndexOutOfBoundsException'
// By clamping 'amountNumbers' to the length if 'userNumbers' if it's larger
if (amountNumbers > userNumbers.Length)
amountNumbers = userNumbers.Length;
// You could use a normal 'string' and '... += ...' but 'StringBuilder' is more efficient
var sb = new StringBuilder();
for (int i = 0; i < amountNumbers; i++)
sb.Append($"{userNumbers[i].ToString()} ");
// Add the calculation, no space at the start required as the loop adds a trailing space
sb.Append($"= {calculation.ToString()}");
memory.Add(sb.ToString());
使用.Take(amountNumbers)
獲取最多amountNumbers
個用戶編號, 。 和String.Join
將字符串與每個字符串之間的一些分隔符組合在一起:
var users = userNumbers.Take(amountNumbers).Select(s => s.ToString());
var str = string.Join(" " + op + " ", users);
memory.Add(str + " = " + calculation.ToString());
如果您需要對案例進行一些特殊處理,例如 if amountNumbers< userNumbers.Count
或amountNumbers == 1
您需要單獨添加。 如果您知道amountNumbers == userNumbers.Count
,則amountNumbers == userNumbers.Count
.Take(...)
。
您只需Join
userNumbers
值與" " + op + " "
分隔符,然后CONCAT calculation
的結尾:
string lastExpression = string.Join(" " + op + " ", userNumbers) + // Join values
" = " + calculation.ToString(); // Concat calculation result
memory.Add(lastExpression);
userNumbers.Clear();
無論userNumbers
有多少個值 - 它們都將通過" " + op + " "
相互連接。
帶有字符串插值的較短版本:
memory.Add($"{string.Join($" {op} ", userNumbers)} = {calculation}");
userNumbers.Clear();
編輯。 這與@JonasH的答案非常相似,只是沒有將userNumbers
轉換為字符串集合。 Join
使它隱含在后面。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.