根据每个项目的第一个字符对列表框中的数字进行数学运算
Doing the maths of numbers in a listbox based on the first character of each item
我有一个程序可以将项目添加到列表框中。这些项目由一个字符(+、-、*、/)后跟数字组成。我想让我的程序识别列表框中项目的第一个字符,并适当地进行数学运算。但是,我似乎做对了。我什至不确定我应该使用什么代码。
只是为了更清楚一点
使用“+34233”格式将项目输入到名为 txtCalculation
的文本框中。然后将该值添加到列表框中 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");
}
}
如果有人可以帮助我修复此代码并向我解释我做错了什么,我将不胜感激。
我不想假设,但您上面提供的代码似乎是方法内部的代码,该方法并未作为代码片段的一部分提供。如果我的假设是正确的,有两种选择可以解决您的问题。第一个选项是将 "total" 变量移出方法并为其提供 class 范围。通过在方法中声明变量 "total" ,每次调用方法时都会将其清除为 0。给它一个 class 范围应该在你每次调用 method/event 时保持变量的值。第二个选项是将 "total" 变量的值设置为 txtTest.Text。您必须将 txtTest.Text 转换为双精度数。有几种不同的方法可以将字符串转换为双精度数。可以研究以下方法:double.Parse(字符串输入),double.TryParse(字符串输入,out双输出),或Convert.ToDouble(字符串输入)进行转换。
我在这方面做了一个小例子:
<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>
这是视图。没什么特别的,只是绑定到 ObservableCollection 数字的 ListView。将显示总数的 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();
}
}
再次强调,我没有进行字符串解析,只是为了按时完成它,咖啡时间,抱歉。
事实上,我使用整数,您将收到字符串、解析符号并获取值,以便继续您的案例切换流程。
下面是代码:
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 中包含列表。
希望对您有所帮助。
我有一个程序可以将项目添加到列表框中。这些项目由一个字符(+、-、*、/)后跟数字组成。我想让我的程序识别列表框中项目的第一个字符,并适当地进行数学运算。但是,我似乎做对了。我什至不确定我应该使用什么代码。
只是为了更清楚一点
使用“+34233”格式将项目输入到名为 txtCalculation
的文本框中。然后将该值添加到列表框中 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");
}
}
如果有人可以帮助我修复此代码并向我解释我做错了什么,我将不胜感激。
我不想假设,但您上面提供的代码似乎是方法内部的代码,该方法并未作为代码片段的一部分提供。如果我的假设是正确的,有两种选择可以解决您的问题。第一个选项是将 "total" 变量移出方法并为其提供 class 范围。通过在方法中声明变量 "total" ,每次调用方法时都会将其清除为 0。给它一个 class 范围应该在你每次调用 method/event 时保持变量的值。第二个选项是将 "total" 变量的值设置为 txtTest.Text。您必须将 txtTest.Text 转换为双精度数。有几种不同的方法可以将字符串转换为双精度数。可以研究以下方法:double.Parse(字符串输入),double.TryParse(字符串输入,out双输出),或Convert.ToDouble(字符串输入)进行转换。
我在这方面做了一个小例子:
<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>
这是视图。没什么特别的,只是绑定到 ObservableCollection 数字的 ListView。将显示总数的 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();
}
}
再次强调,我没有进行字符串解析,只是为了按时完成它,咖啡时间,抱歉。
事实上,我使用整数,您将收到字符串、解析符号并获取值,以便继续您的案例切换流程。
下面是代码:
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 中包含列表。 希望对您有所帮助。