需要逻辑来添加计数

时间:2013-07-02 10:09:31

标签: c# regex

我有3套以下数据。

EUR5-002,EUR10-000,
EUR20-001,EUR50-001,
EUR100-001,EUR200-000,
EUR500-000

EUR5-000,EUR10-000,
EUR20-002,EUR50-001,
EUR100-001,EUR200-000,
EUR500-000

EUR5-001,EUR10-001,
EUR20-002,EUR50-001,
EUR100-002,EUR200-003,
EUR500-000

此处EUR - CurrencyID和5,10,20,50,100,200,500是货币值。 “ - ”之后的值不是相应面额的注释。(EUR5-002,表示5个EURO的2个钞票)

在我的代码中,我已将每个集合读取为字符串并添加到List。

我需要使用正则表达式或其他方法在C#中使用逻辑从所有3组数据中添加每个单独的面额计数。

根据以上数据,我必须得到如下输出。

EUR5-003,EUR10-001,
EUR20-005,EUR50-003,
EUR100-004,EUR200-003,
EUR500-000

2 个答案:

答案 0 :(得分:1)

代码不处理可能由错误的输入格式引起的任何错误,您可以自己维护它。

using System;
using System.Collections.Generic;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            var data = new [] {
                "EUR5-002,EUR10-000,EUR20-001,EUR50-001,EUR100-001,EUR200-000,EUR500-000", 
                "EUR5-000,EUR10-000,EUR20-002,EUR50-001,EUR100-001,EUR200-000,EUR500-000", 
                "EUR5-001,EUR10-001,EUR20-002,EUR50-001,EUR100-002,EUR200-003,EUR500-000"
            };

            var results = new Dictionary<string, int>();

            foreach (var line in data)
            {
                var entries = line.Split(',');
                foreach (var entry in entries)
                {
                    var parts = entry.Split('-');
                    string key = parts[0];
                    if (!results.ContainsKey(key))
                    {
                        results[key] = 0;
                    }

                    results[key] += int.Parse(parts[1]);
                }
            }

            foreach (var result in results)
            {
                Console.WriteLine(result.Key + "-" + result.Value.ToString("000"));
            }

            Console.ReadLine();
        }
    }
}

答案 1 :(得分:0)

你可以这样做

//limit is the highest value of currency
int temp=0;
for(int x=1;x<=limit;x++,temp=0)
{
if((temp=parseDenomination(x,input))!=0)
     output+=","+"EUR"+x+"-"+temp;
}
//output has your desired output

private static int parseDenomination(int no,String input)
{
        return Regex.Matches(input,@"(?<=EUR"+no+@"-)\d+")
                    .Cast<Match>()
                    .Select(x=>int.Parse(x.Groups[0].Value))
                    .ToList()
                    .Sum();
}