如何对列表框中的字符串项求和

本文关键字:字符串 求和 列表 | 更新日期: 2023-09-27 18:31:17

如果项目字符串不是整数,如何对列表框中的项目求和?

listBox1.Items.Add("merry has (5 $) ")
listBox1.Items.Add("sandy has (10 $)")

我需要添加这笔美元,输出将在标签中。

如何对列表框中的字符串项求和

var sum = listBox1.Items.Cast<string>()
                  .Select(x => int.Parse(Regex.Match(x, @"'d+").Value))
                  .Sum();

以防万一您的某些项目不包含任何数字

var sum = listBox1.Items.Cast<string>()
                  .Select(x => Regex.Match(x, @"'d+").Value)
                  .Where(x=> !String.IsNullOrEmpty(x))
                  .Select(x=>int.Parse(x))
                  .Sum();

看看正则表达式,它们将帮助您从字符串中提取数字。

然后看看 Int32.Parse 将它们转换为数字。

最后看看 LINQ 以学习如何总结它们。

祝你好运!

另一种没有正则表达式的方法,使用自定义NumberFormatInfo进行decimal.TryParse

NumberFormatInfo nfi = new NumberFormatInfo();
nfi.CurrencySymbol = "$";
nfi.CurrencyPositivePattern = 3;
nfi.CurrencyNegativePattern = 8;
nfi.NegativeSign = "-";
decimal value = 0;
var dollars = from item in listBox1.Items.Cast<string>()
              let startIndex = item.IndexOf("(")
              where startIndex >= 0
              let endIndex = item.IndexOf(")", startIndex + 1)
              where endIndex >= 0
              let parsable = decimal.TryParse(item.Substring(startIndex + 1, endIndex - startIndex - 1), NumberStyles.Currency, nfi, out value)
              where parsable
              select value;
decimal sumDollars = dollars.Sum();

积极的模式:

0  $n 
1  n$
2  $ n
3  n $ 

负面模式。

这是另一种方法,但不像 EZI 的解决方案那么简洁:

int sum = 0;
foreach (var item in listBox1.Items.Cast<string>())
{
    int tmp;
    int startInt = item.IndexOf('(');
    int endInt = item.IndexOf('$');
    if (startInt > -1 &&
        endInt > startInt &&
        int.TryParse(item.Substring(++startInt, endInt - startInt), out tmp))
    {
        sum += tmp;
    }
}
MessageBox.Show(string.Format("Sum is: {0} $", sum));
// Output:
// Sum is: 15 $

为了构建DavidP的想法,您可以使用自定义类来存储显示字符串和美元值。

例如,考虑这个简单的类,它将字符串作为构造函数的参数,并具有两个属性:DisplayText (字符串) 和 DollarValue (int)(它重写 ToString() 方法以在 ListBox 中显示)。它会自动从字符串中获取美元金额,并相应地设置其DollarValue属性:

private class CustomListItem
{
    public string DisplayText { get; private set; }
    public int DollarValue { get; private set; }
    public CustomListItem(string text)
    {
        this.DisplayText = text;
        this.DollarValue = GetDollarValueFromString(text);
    }
    private int GetDollarValueFromString(string input)
    {
        if (input == null) return 0;
        int dollarValue = 0;
        int start = input.IndexOf('(');
        int end = input.IndexOf('$');
        if (start > -1 && end > start)
        {
            int.TryParse(
                input.Substring(++start, end - start), 
                out dollarValue);
        }
        return dollarValue;
    }
    public override string ToString()
    {
        return DisplayText;
    }
}

您可以基于数据源中的字符串创建这些类的列表,并将它们添加到 ListBox,如下所示:

// Normally items would come from some external datasource
var items = new List<string>
{
    "merry has (5 $)",
    "sandy has (10 $)"
};
// Add our CustomListItem class instead of strings to the list box
items.ForEach(i => listBox1.Items.Add(new CustomListItem(i)));

现在,当您想要显示总和时,只需使用自定义类的 .DollarValue 属性:

int sum = listBox1.Items.Cast<CustomListItem>().Sum(item => item.DollarValue);
MessageBox.Show(string.Format("Sum is: {0} $", sum));

我会将美元金额添加为列表框项的值,并将整个文本部分添加为文本。

ListItem li1 = new ListItem();
li1.Text = "merry has (5 $)";
li1.Value = "5";
listBox1.Items.Add(li1);
ListItem li2 = new ListItem();
li2.Text = "sandy has (10 $)"
li2.Value = "10";
listBox1.Items.Add(li2);

然后,您可以非常简单地将它们添加在一起:

double sumMoney = 0;
foreach (ListItem li in listBox1.Items)
{
     sumMoney = sumMoney + Convert.ToDouble(li.Value);
}
lblText.Text = sumMoney.ToString()