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