根据每个项目的第一个字符对列表框中的数字进行数学运算
本文关键字:数字 运算 项目 第一个 字符 列表 | 更新日期: 2023-09-27 17:54:07
我有一个将项目添加到列表框的程序。条目由字符(+、-、*、/)和数字组成。我想让我的程序识别列表框中项目的第一个字符,并适当地进行数学运算。然而,我似乎做不对。我甚至不确定我应该用什么代码。
为了更清楚一点
条目被输入到名为txtCalculation
的文本框中,格式为"+34233"。然后将该值添加到列表框lstDisplay
中,因此在5项之后,它应该是这样的:
+2
+4
/2
-1
+5
*3
total = 21
我想找到一种方法让程序遍历列表并进行数学运算,然后将其作为最后一项添加到列表中,如上所示。我已经有代码将数字添加到列表中,并尝试将它们加在一起,然后将它们放在一个名为txtTest
的文本框中,但每次我添加一个新数字txtTest只是设置为我添加到列表框中的最后一个数字,而不是显示这些数字的总数
到目前为止的代码
double total = 0;
string line = "";
if (txtCalculation.Text.Length > 1)
{
if (e.KeyChar == (char)Keys.Enter)
{
string Number = txtCalculation.Text;
try
{
switch (Number[0])
{
case '+':
total += Convert.ToInt32(Number.Substring(1));
break;
case '-':
total -= Convert.ToInt32(Number.Substring(1));
break;
}
lstDisplay.Items.Add(Number);
txtCalculation.Text = "";
txtTest.Text = total.ToString();
}
catch (Exception ex)
{
MessageBox.Show("Error");
}
}
如果有人能帮我修复这段代码,并向我解释我做错了什么,我将非常感激。
我做了一个小例子:
<Window x:Class="AddTotalListConverter.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:AddTotalListConverter"
Title="MainWindow" Height="350" Width="525">
<Grid>
<Grid.Resources>
<local:ComputationConverter x:Key="ComputationConverter"/>
</Grid.Resources>
<StackPanel>
<ListView x:Name="lvNumbers" ItemsSource="{Binding numbers}">
<ListView.View>
<GridView>
<GridViewColumn Header="Numbers">
<GridViewColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding}"/>
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
</GridView>
</ListView.View>
</ListView>
<StackPanel Orientation="Horizontal" Margin="0,10">
<TextBlock Text="New Number" Margin="5,0"/>
<TextBox x:Name="tbNewNumber" MinWidth="50" Margin="5,0"/>
<Button Content="Add Number" Margin="5,0" Click="btnAddNumber_Click"/>
</StackPanel>
<StackPanel Orientation="Horizontal" Margin="0,20"/>
<TextBlock Text="{Binding numbers.Count, Converter={StaticResource ComputationConverter}, ConverterParameter={x:Reference lvNumbers}}"/>
</StackPanel>
</Grid>
这是视图。没有什么太花哨的,只是ListView绑定到ObservableCollection数字。将显示总数的TextBlock被限定为项目计数。所以,每次你添加或删除一个项目时,它都会被更新。这里有一个转换器,它的参数是ListView本身。
class ComputationConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
int result = 0;
ListView lv = parameter as ListView;
Console.WriteLine(lv.Items);
foreach (var item in lv.Items)
{
result += (int)item;
}
return result;
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}
再次,我保持它的简单,没有字符串解析只是为了按时完成它,咖啡时间,对不起。
实际上我使用int,你将接收字符串,解析符号并获取值,以便继续你的大小写转换流程。
下面是代码:
public partial class MainWindow : Window
{
public ObservableCollection<int> numbers { get; set; }
public MainWindow()
{
InitializeComponent();
numbers = new ObservableCollection<int>();
this.DataContext = this;
}
private void btnAddNumber_Click(object sender, RoutedEventArgs e)
{
if (!string.IsNullOrEmpty(tbNewNumber.Text))
{
numbers.Add(int.Parse(tbNewNumber.Text));
}
}
}
如果您需要MVVM方法,我可以稍后进行更新,使用命令并在ViewModel中拥有列表。
我不愿意假设,但是您上面提供的代码似乎是方法内部的代码,而该方法不是作为代码片段的一部分提供的。如果我的假设是正确的,有两个选项可以解决你的问题。第一种选择是将"total"变量移出方法并赋予它一个类作用域。通过在方法中声明变量"total",每次调用方法时都将其清除为0。给它一个类作用域应该在每次调用方法/事件时保持变量的值。第二个选项是将"total"变量的值设置为txtTest.Text。您必须转换txtTest。文本到double类型。有几种不同的方法可以将字符串转换为双精度类型。您可以研究以下方法:加倍。解析(字符串输入),double。TryParse(字符串输入,输出双输出),或Convert。ToDouble(字符串输入)进行转换