簡體   English   中英

簡化 list.add 未知數量的條目

[英]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.CountamountNumbers == 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM