繁体   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