根据每个项目的第一个字符对列表框中的数字进行数学运算

本文关键字:数字 运算 项目 第一个 字符 列表 | 更新日期: 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(字符串输入)进行转换